From 735fb14fe7461bcd2d3d0baa876fd1efbdbd0208 Mon Sep 17 00:00:00 2001 From: NU-LL <1125934312@qq.com> Date: Sat, 25 Mar 2023 19:28:21 +0800 Subject: [PATCH] [bsp][stm32] add stm32h750-fk750m1-vbt6 bsp --- .github/workflows/action.yml | 3 +- .gitignore | 4 +- bsp/stm32/libraries/HAL_Drivers/drv_spi.c | 2 +- .../stm32h750-fk750m1-vbt6/.clang-format | 38 + bsp/stm32/stm32h750-fk750m1-vbt6/.config | 1032 ++++++++ bsp/stm32/stm32h750-fk750m1-vbt6/.gitignore | 42 + .../EventRecorderStub.scvd | 9 + bsp/stm32/stm32h750-fk750m1-vbt6/Kconfig | 21 + bsp/stm32/stm32h750-fk750m1-vbt6/README.md | 122 + bsp/stm32/stm32h750-fk750m1-vbt6/SConscript | 14 + bsp/stm32/stm32h750-fk750m1-vbt6/SConstruct | 60 + .../applications/SConscript | 16 + .../applications/main.c | 32 + .../board/CubeMX_Config/CubeMX_Config.ioc | 329 +++ .../board/CubeMX_Config/Inc/main.h | 69 + .../CubeMX_Config/Inc/stm32h7xx_hal_conf.h | 515 ++++ .../board/CubeMX_Config/Inc/stm32h7xx_it.h | 68 + .../board/CubeMX_Config/Src/main.c | 493 ++++ .../CubeMX_Config/Src/stm32h7xx_hal_msp.c | 643 +++++ .../board/CubeMX_Config/Src/stm32h7xx_it.c | 232 ++ .../CubeMX_Config/Src/system_stm32h7xx.c | 450 ++++ .../stm32h750-fk750m1-vbt6/board/Kconfig | 132 + .../stm32h750-fk750m1-vbt6/board/SConscript | 58 + .../stm32h750-fk750m1-vbt6/board/board.c | 132 + .../stm32h750-fk750m1-vbt6/board/board.h | 100 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 157 ++ .../board/linker_scripts/link.sct | 15 + .../board/port/camera/drv_dcmi.c | 457 ++++ .../board/port/camera/drv_dcmi.h | 60 + .../board/port/camera/drv_ov2640.c | 538 ++++ .../board/port/camera/drv_ov2640.h | 94 + .../board/port/camera/drv_ov2640_cfg.h | 495 ++++ .../board/port/fal_cfg.h | 60 + .../board/port/lcd/drv_lcd_spi.c | 621 +++++ .../board/port/lcd/drv_lcd_spi.h | 57 + .../board/port/lcd/drv_lcd_spi_ext.c | 332 +++ .../board/port/lcd/drv_lcd_spi_ext.h | 44 + .../board/port/lcd/lcd_port.h | 41 + .../stm32h750-fk750m1-vbt6/figures/board.jpg | Bin 0 -> 492112 bytes bsp/stm32/stm32h750-fk750m1-vbt6/project.ewp | 2329 +++++++++++++++++ bsp/stm32/stm32h750-fk750m1-vbt6/project.eww | 10 + .../stm32h750-fk750m1-vbt6/project.uvoptx | 1384 ++++++++++ .../stm32h750-fk750m1-vbt6/project.uvprojx | 1876 +++++++++++++ bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.h | 264 ++ bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.py | 185 ++ bsp/stm32/stm32h750-fk750m1-vbt6/template.ewp | 2074 +++++++++++++++ bsp/stm32/stm32h750-fk750m1-vbt6/template.eww | 10 + .../stm32h750-fk750m1-vbt6/template.uvoptx | 184 ++ .../stm32h750-fk750m1-vbt6/template.uvprojx | 390 +++ 50 files changed, 16318 insertions(+), 3 deletions(-) create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/.clang-format create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/.config create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/.gitignore create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/EventRecorderStub.scvd create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/Kconfig create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/README.md create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/SConscript create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/SConstruct create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/applications/SConscript create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/applications/main.c create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/stm32h7xx_hal_conf.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/stm32h7xx_it.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/stm32h7xx_hal_msp.c create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/stm32h7xx_it.c create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/system_stm32h7xx.c create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/Kconfig create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/SConscript create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/board.c create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/board.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_dcmi.c create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_dcmi.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640.c create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640_cfg.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/port/fal_cfg.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi.c create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi_ext.c create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi_ext.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/lcd_port.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/figures/board.jpg create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/project.ewp create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/project.eww create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/project.uvoptx create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/project.uvprojx create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.h create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.py create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/template.ewp create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/template.eww create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/template.uvoptx create mode 100644 bsp/stm32/stm32h750-fk750m1-vbt6/template.uvprojx diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml index 3bf4d8bafc..b8ce1feadf 100644 --- a/.github/workflows/action.yml +++ b/.github/workflows/action.yml @@ -127,7 +127,7 @@ jobs: - {RTT_BSP: "nrf5x/nrf52832", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "nrf5x/nrf52833", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "nrf5x/nrf52840", RTT_TOOL_CHAIN: "sourcery-arm"} - - {RTT_BSP: "nrf5x/nrf5340", RTT_TOOL_CHAIN: "sourcery-arm"} + - {RTT_BSP: "nrf5x/nrf5340", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "qemu-vexpress-a9", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "sam7x", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "stm32/stm32f072-st-nucleo", RTT_TOOL_CHAIN: "sourcery-arm"} @@ -187,6 +187,7 @@ jobs: # - {RTT_BSP: "stm32h750-armfly-h7-tool", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "stm32/stm32h750-artpi", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "stm32/stm32h750-weact-ministm32h7xx", RTT_TOOL_CHAIN: "sourcery-arm"} + - {RTT_BSP: "stm32/stm32h750-fk750m1-vbt6", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "stm32/stm32l4r5-st-nucleo", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "stm32/stm32l4r9-st-eval", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "stm32/stm32l4r9-st-sensortile-box", RTT_TOOL_CHAIN: "sourcery-arm"} diff --git a/.gitignore b/.gitignore index ce663a867d..558b09f1e4 100644 --- a/.gitignore +++ b/.gitignore @@ -28,7 +28,7 @@ documentation/html *.dfinish *.su #source insight 4 project files -*.si4project +*.si4project tools/kconfig-frontends/kconfig-mconf packages dist @@ -45,6 +45,8 @@ tags .idea .vscode +*.code-workspace +*.eide.* .history CMakeLists.txt cmake-build-debug diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_spi.c b/bsp/stm32/libraries/HAL_Drivers/drv_spi.c index 12afd5624f..088a21198a 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_spi.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_spi.c @@ -283,7 +283,7 @@ static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configur static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *message) { - HAL_StatusTypeDef state = HAL_OK;; + HAL_StatusTypeDef state = HAL_OK; rt_size_t message_length, already_send_length; rt_uint16_t send_length; rt_uint8_t *recv_buf; diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/.clang-format b/bsp/stm32/stm32h750-fk750m1-vbt6/.clang-format new file mode 100644 index 0000000000..ecc57c4a22 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/.clang-format @@ -0,0 +1,38 @@ +--- +BasedOnStyle: Microsoft +Language: Cpp + +################################### +# indent conf +################################### + +UseTab: Never +IndentWidth: 4 +TabWidth: 4 +ColumnLimit: 0 +AccessModifierOffset: -4 +NamespaceIndentation: All +FixNamespaceComments: false +BreakBeforeBraces: Linux + +################################### +# other styles +################################### + +# +# for more conf, you can ref: https://clang.llvm.org/docs/ClangFormatStyleOptions.html +# + +AllowShortIfStatementsOnASingleLine: true + +AllowShortLoopsOnASingleLine: true + +AllowShortBlocksOnASingleLine: true + +IndentCaseLabels: true + +SortIncludes: false + +AlignConsecutiveMacros: AcrossEmptyLines + +AlignConsecutiveAssignments: Consecutive diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/.config b/bsp/stm32/stm32h750-fk750m1-vbt6/.config new file mode 100644 index 0000000000..713b8e11e1 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/.config @@ -0,0 +1,1032 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set + +# +# kservice optimization +# +CONFIG_RT_KSERVICE_USING_STDLIB=y +# CONFIG_RT_KSERVICE_USING_STDLIB_MEMORY is not set +# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set +# CONFIG_RT_USING_TINY_FFS is not set +# CONFIG_RT_KPRINTF_USING_LONGLONG is not set +CONFIG_RT_DEBUG=y +CONFIG_RT_DEBUG_COLOR=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_PAGE_MAX_ORDER=11 +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_SMALL_MEM is not set +# CONFIG_RT_USING_SLAB is not set +CONFIG_RT_USING_MEMHEAP=y +CONFIG_RT_MEMHEAP_FAST_MODE=y +# CONFIG_RT_MEMHEAP_BEST_MODE is not set +# CONFIG_RT_USING_SMALL_MEM_AS_HEAP is not set +CONFIG_RT_USING_MEMHEAP_AS_HEAP=y +CONFIG_RT_USING_MEMHEAP_AUTO_BINDING=y +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x50000 +CONFIG_RT_USING_CACHE=y +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M7=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_RT_USING_DFS=y +CONFIG_DFS_USING_POSIX=y +CONFIG_DFS_USING_WORKDIR=y +CONFIG_DFS_FILESYSTEMS_MAX=4 +CONFIG_DFS_FILESYSTEM_TYPES_MAX=4 +CONFIG_DFS_FD_MAX=16 +# CONFIG_RT_USING_DFS_MNTTABLE is not set +# CONFIG_RT_USING_DFS_ELMFAT is not set +CONFIG_RT_USING_DFS_DEVFS=y +# CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_CROMFS is not set +# CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_TMPFS is not set +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +# CONFIG_RT_USING_SERIAL_V1 is not set +CONFIG_RT_USING_SERIAL_V2=y +CONFIG_RT_SERIAL_USING_DMA=y +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_I2C=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_PHY is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set +CONFIG_RT_USING_RTC=y +# CONFIG_RT_USING_ALARM is not set +# CONFIG_RT_USING_SOFT_RTC is not set +# CONFIG_RT_USING_SDIO is not set +CONFIG_RT_USING_SPI=y +# CONFIG_RT_USING_SPI_BITOPS is not set +CONFIG_RT_USING_QSPI=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=y +CONFIG_RT_SFUD_SPI_MAX_HZ=10000000 +# CONFIG_RT_DEBUG_SFUD is not set +# CONFIG_RT_USING_ENC28J60 is not set +# CONFIG_RT_USING_SPI_WIFI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB is not set +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# C/C++ and POSIX layer +# +CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# CONFIG_RT_USING_VBUS is not set + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LWIP is not set +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_EZ_IOT_OS is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_PERSIMMON is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_CHERRYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set + +# +# peripheral libraries and drivers +# + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ESP_IDF is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_BL_MCU_SDK is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + +# +# miscellaneous packages +# + +# +# project laboratory +# + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set +# CONFIG_PKG_USING_GET_IRQ_PRIORITY is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_U8GLIB_ARDUINO is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32H7=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32H750VBT6=y + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_LCD_SPI=y +# CONFIG_BSP_USING_OV2640 is not set + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_UART1_RX_USING_DMA is not set +# CONFIG_BSP_USING_QSPI is not set +CONFIG_BSP_USING_SPI=y +CONFIG_BSP_USING_SPI4=y +# CONFIG_BSP_SPI4_TX_USING_DMA is not set +# CONFIG_BSP_USING_DCMI is not set +# CONFIG_BSP_USING_I2C is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set +# CONFIG_BSP_USING_CRC is not set +# CONFIG_BSP_USING_RNG is not set +# CONFIG_BSP_USING_UDID is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/.gitignore b/bsp/stm32/stm32h750-fk750m1-vbt6/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/.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/stm32/stm32h750-fk750m1-vbt6/EventRecorderStub.scvd b/bsp/stm32/stm32h750-fk750m1-vbt6/EventRecorderStub.scvd new file mode 100644 index 0000000000..2956b29683 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/EventRecorderStub.scvd @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/Kconfig b/bsp/stm32/stm32h750-fk750m1-vbt6/Kconfig new file mode 100644 index 0000000000..79b160b856 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/Kconfig @@ -0,0 +1,21 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "../libraries/Kconfig" +source "board/Kconfig" diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/README.md b/bsp/stm32/stm32h750-fk750m1-vbt6/README.md new file mode 100644 index 0000000000..fc5f439abb --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/README.md @@ -0,0 +1,122 @@ +# FANKE FK750M1-VBT6 开发板 BSP 说明 + +## 简介 + +本文档为 FANKE FK750M1-VBT6 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +FK750M1-VBT6 是 FANKE 推出的一款基于 ARM Cortex-M7 内核的核心板,最高频率为480Mhz,具有128KB ROM、1MB RAM,外接 8MB QSPI Flash,板载资源如下: + +* 外扩 W25Q64,容量 8M 字节 +* 1 个复位按键,1 个用户按键 +* 1 个 BOOT 按键 +* 1 个用户 LED +* 1 个 Type C 接口 +* 1 个 TF 卡接口 +* 1 个SPI 液晶和摄像头接口 +* 引出 73 个 IO 口 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------------: | :------------: | +| TF Card | 待支持 | | +| QSPI Flash | 待支持 | W25Q64JV | +| OV2640 Camera | 支持 | | +| OV5640 Camera | 待支持 | | +| 0.96' LCD | 待支持 | 160*80 | +| 1.14' LCD | 待支持 | 240*135 | +| 1.30' LCD | 支持 | 240*240 | +| 1.54' LCD | 待支持 | 240*240 | +| 1.69' LCD | 待支持 | 240*280 | +| 2.00' LCD | 待支持 | 240*320 | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | | +| UART | 支持 | USART1 | +| SPI | 支持 | | +| RTC | 支持 | | +| USB Device | 待支持 | | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC。使用 usb 转串口工具连接 PA9 ( USART1_TX ) 和 PA10 ( USART1_RX )。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,LED闪烁。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 5.0.0 build Mar 22 2023 00:10:44 + 2006 - 2022 Copyright by RT-Thread team +msh /> +``` + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口1 的功能,如果需使用更多高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 +2. 输入 `menuconfig` 命令配置工程,配置好之后保存退出。 +3. 输入 `pkgs --update` 命令更新软件包。 +4. 输入 `scons --target=mdk4/mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +- 目前仅测试 V1.1 版本硬件,较老的 V1.0 暂未测试 +- 默认仅开启 LCD 功能,此时生成的固件大小约为 110k 左右,如果开启其他功能固件超过 128k ,可以通过如下方式: + + 1. H750 实际上可以使用片内 2M ram,但是 128k 后 ST 不保证可用性,此时可以: + 1. 在 keil 中芯片选为 H743 ,此时会出现 2MB Flash 的下载算法,选择此下载算法下载程序 + 2. bsp\stm32\stm32h750-weact-ministm32h7xx 目录下会提供一份 h750 的 keil 内部 ram 的下载算法,可以采用下载算法 + 2. 通过 bootloader 从片外 qspi flash 启动 +- 调试串口为串口1 映射说明 + + PA9 ------> USART1_TX + + PA10 ------> USART1_RX + +## 联系人信息 + +维护人: + +- [NU-LL](https://github.com/NU-LL) diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/SConscript b/bsp/stm32/stm32h750-fk750m1-vbt6/SConscript new file mode 100644 index 0000000000..c7ef7659ec --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/SConscript @@ -0,0 +1,14 @@ +# for module compiling +import os +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/stm32/stm32h750-fk750m1-vbt6/SConstruct b/bsp/stm32/stm32h750-fk750m1-vbt6/SConstruct new file mode 100644 index 0000000000..02c0e78cd2 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/SConstruct @@ -0,0 +1,60 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rt-thread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM in ['iccarm']: + env.Replace(CCCOM = ['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = 'STM32H7xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'))) + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/applications/SConscript b/bsp/stm32/stm32h750-fk750m1-vbt6/applications/SConscript new file mode 100644 index 0000000000..034056eca7 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/applications/SConscript @@ -0,0 +1,16 @@ +import rtconfig +from building import * +import os + +cwd = GetCurrentDir() +path = [cwd] +src = Glob('*.c') + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = path) + +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/stm32/stm32h750-fk750m1-vbt6/applications/main.c b/bsp/stm32/stm32h750-fk750m1-vbt6/applications/main.c new file mode 100644 index 0000000000..679a6c38b6 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/applications/main.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-10-25 zylx first version + */ + +#include +#include +#include + +/* defined the LED1 pin: PC13 */ +#define LED1_PIN GET_PIN(C, 13) + +int main(void) +{ + int count = 1; + /* set LED0 pin mode to output */ + rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED1_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED1_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + return RT_EOK; +} diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..7f2af4753f --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,329 @@ +#MicroXplorer Configuration settings - do not modify +CAD.formats=[] +CAD.pinconfig=Project naming +CAD.provider= +CORTEX_M7.CPU_DCache=Enabled +CORTEX_M7.CPU_ICache=Enabled +CORTEX_M7.IPParameters=CPU_ICache,CPU_DCache +DCMI.IPParameters=PCKPolarity +DCMI.PCKPolarity=DCMI_PCKPOLARITY_RISING +File.Version=6 +GPIO.groupedBy= +KeepUserPlacement=false +Mcu.CPN=STM32H750VBT6 +Mcu.Family=STM32H7 +Mcu.IP0=CORTEX_M7 +Mcu.IP1=DCMI +Mcu.IP10=USART1 +Mcu.IP2=DEBUG +Mcu.IP3=NVIC +Mcu.IP4=QUADSPI +Mcu.IP5=RCC +Mcu.IP6=RTC +Mcu.IP7=SDMMC1 +Mcu.IP8=SPI4 +Mcu.IP9=SYS +Mcu.IPNb=11 +Mcu.Name=STM32H750VBTx +Mcu.Package=LQFP100 +Mcu.Pin0=PE2 +Mcu.Pin1=PE4 +Mcu.Pin10=PB2 +Mcu.Pin11=PE11 +Mcu.Pin12=PE12 +Mcu.Pin13=PE14 +Mcu.Pin14=PD11 +Mcu.Pin15=PD12 +Mcu.Pin16=PD13 +Mcu.Pin17=PC6 +Mcu.Pin18=PC7 +Mcu.Pin19=PC8 +Mcu.Pin2=PE5 +Mcu.Pin20=PC9 +Mcu.Pin21=PA9 +Mcu.Pin22=PA10 +Mcu.Pin23=PA13 (JTMS/SWDIO) +Mcu.Pin24=PA14 (JTCK/SWCLK) +Mcu.Pin25=PC10 +Mcu.Pin26=PC11 +Mcu.Pin27=PC12 +Mcu.Pin28=PD2 +Mcu.Pin29=PD3 +Mcu.Pin3=PE6 +Mcu.Pin30=PB6 +Mcu.Pin31=PB7 +Mcu.Pin32=PE0 +Mcu.Pin33=PE1 +Mcu.Pin34=VP_RTC_VS_RTC_Activate +Mcu.Pin35=VP_SYS_VS_Systick +Mcu.Pin4=PC14-OSC32_IN (OSC32_IN) +Mcu.Pin5=PC15-OSC32_OUT (OSC32_OUT) +Mcu.Pin6=PH0-OSC_IN (PH0) +Mcu.Pin7=PH1-OSC_OUT (PH1) +Mcu.Pin8=PA4 +Mcu.Pin9=PA6 +Mcu.PinsNb=36 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32H750VBTx +MxCube.Version=6.8.0 +MxDb.Version=DB.6.0.80 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DCMI_IRQn=true\:0\:0\:true\:false\:true\:true\:true\:true +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SDMMC1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA10.Locked=true +PA10.Mode=Asynchronous +PA10.Signal=USART1_RX +PA13\ (JTMS/SWDIO).Mode=Serial_Wire +PA13\ (JTMS/SWDIO).Signal=DEBUG_JTMS-SWDIO +PA14\ (JTCK/SWCLK).Mode=Serial_Wire +PA14\ (JTCK/SWCLK).Signal=DEBUG_JTCK-SWCLK +PA4.GPIOParameters=GPIO_Speed +PA4.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PA4.Mode=Slave_8_bits_External_Synchro +PA4.Signal=DCMI_HSYNC +PA6.GPIOParameters=GPIO_Speed +PA6.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PA6.Mode=Slave_8_bits_External_Synchro +PA6.Signal=DCMI_PIXCLK +PA9.Locked=true +PA9.Mode=Asynchronous +PA9.Signal=USART1_TX +PB2.GPIOParameters=GPIO_Speed +PB2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PB2.Mode=Single Bank 1 +PB2.Signal=QUADSPI_CLK +PB6.GPIOParameters=GPIO_Speed +PB6.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PB6.Locked=true +PB6.Mode=Single Bank 1 +PB6.Signal=QUADSPI_BK1_NCS +PB7.GPIOParameters=GPIO_Speed +PB7.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PB7.Mode=Slave_8_bits_External_Synchro +PB7.Signal=DCMI_VSYNC +PC10.Mode=SD_4_bits_Wide_bus +PC10.Signal=SDMMC1_D2 +PC11.Mode=SD_4_bits_Wide_bus +PC11.Signal=SDMMC1_D3 +PC12.Mode=SD_4_bits_Wide_bus +PC12.Signal=SDMMC1_CK +PC14-OSC32_IN\ (OSC32_IN).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (OSC32_IN).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (OSC32_OUT).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (OSC32_OUT).Signal=RCC_OSC32_OUT +PC6.GPIOParameters=GPIO_Speed +PC6.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PC6.Mode=Slave_8_bits_External_Synchro +PC6.Signal=DCMI_D0 +PC7.GPIOParameters=GPIO_Speed +PC7.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PC7.Mode=Slave_8_bits_External_Synchro +PC7.Signal=DCMI_D1 +PC8.Mode=SD_4_bits_Wide_bus +PC8.Signal=SDMMC1_D0 +PC9.Mode=SD_4_bits_Wide_bus +PC9.Signal=SDMMC1_D1 +PD11.GPIOParameters=GPIO_Speed +PD11.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PD11.Mode=Single Bank 1 +PD11.Signal=QUADSPI_BK1_IO0 +PD12.GPIOParameters=GPIO_Speed +PD12.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PD12.Mode=Single Bank 1 +PD12.Signal=QUADSPI_BK1_IO1 +PD13.GPIOParameters=GPIO_Speed +PD13.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PD13.Locked=true +PD13.Mode=Single Bank 1 +PD13.Signal=QUADSPI_BK1_IO3 +PD2.Mode=SD_4_bits_Wide_bus +PD2.Signal=SDMMC1_CMD +PD3.GPIOParameters=GPIO_Speed +PD3.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PD3.Mode=Slave_8_bits_External_Synchro +PD3.Signal=DCMI_D5 +PE0.GPIOParameters=GPIO_Speed +PE0.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PE0.Locked=true +PE0.Mode=Slave_8_bits_External_Synchro +PE0.Signal=DCMI_D2 +PE1.GPIOParameters=GPIO_Speed +PE1.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PE1.Locked=true +PE1.Mode=Slave_8_bits_External_Synchro +PE1.Signal=DCMI_D3 +PE11.GPIOParameters=GPIO_Speed +PE11.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PE11.Mode=NSS_Signal_Hard_Output +PE11.Signal=SPI4_NSS +PE12.GPIOParameters=GPIO_Speed +PE12.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PE12.Mode=TX_Only_Simplex_Unidirect_Master +PE12.Signal=SPI4_SCK +PE14.GPIOParameters=GPIO_Speed +PE14.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PE14.Mode=TX_Only_Simplex_Unidirect_Master +PE14.Signal=SPI4_MOSI +PE2.GPIOParameters=GPIO_Speed +PE2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PE2.Mode=Single Bank 1 +PE2.Signal=QUADSPI_BK1_IO2 +PE4.GPIOParameters=GPIO_Speed +PE4.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PE4.Mode=Slave_8_bits_External_Synchro +PE4.Signal=DCMI_D4 +PE5.GPIOParameters=GPIO_Speed +PE5.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PE5.Mode=Slave_8_bits_External_Synchro +PE5.Signal=DCMI_D6 +PE6.GPIOParameters=GPIO_Speed +PE6.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PE6.Mode=Slave_8_bits_External_Synchro +PE6.Signal=DCMI_D7 +PH0-OSC_IN\ (PH0).Mode=HSE-External-Oscillator +PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN +PH1-OSC_OUT\ (PH1).Mode=HSE-External-Oscillator +PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32H750VBTx +ProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.11.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x4000 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=CubeMX_Config.ioc +ProjectManager.ProjectName=CubeMX_Config +ProjectManager.ProjectStructure= +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x3000 +ProjectManager.TargetToolchain=MDK-ARM V5.32 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_QUADSPI_Init-QUADSPI-false-HAL-true,4-MX_DCMI_Init-DCMI-false-HAL-true,5-MX_RTC_Init-RTC-false-HAL-true,6-MX_SDMMC1_SD_Init-SDMMC1-false-HAL-true,7-MX_USART1_UART_Init-USART1-false-HAL-true,8-MX_SPI4_Init-SPI4-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true +QUADSPI.ClockMode=QSPI_CLOCK_MODE_3 +QUADSPI.ClockPrescaler=1 +QUADSPI.FifoThreshold=32 +QUADSPI.FlashSize=22 +QUADSPI.IPParameters=ClockPrescaler,FifoThreshold,SampleShifting,FlashSize,ClockMode +QUADSPI.SampleShifting=QSPI_SAMPLE_SHIFTING_HALFCYCLE +RCC.ADCFreq_Value=50390625 +RCC.AHB12Freq_Value=240000000 +RCC.AHB4Freq_Value=240000000 +RCC.APB1Freq_Value=120000000 +RCC.APB2Freq_Value=120000000 +RCC.APB3Freq_Value=120000000 +RCC.APB4Freq_Value=120000000 +RCC.AXIClockFreq_Value=240000000 +RCC.CECFreq_Value=32000 +RCC.CKPERFreq_Value=64000000 +RCC.CortexFreq_Value=480000000 +RCC.CpuClockFreq_Value=480000000 +RCC.D1CPREFreq_Value=480000000 +RCC.D1PPRE=RCC_APB3_DIV2 +RCC.D2PPRE1=RCC_APB1_DIV2 +RCC.D2PPRE2=RCC_APB2_DIV2 +RCC.D3PPRE=RCC_APB4_DIV2 +RCC.DFSDMACLkFreq_Value=240000000 +RCC.DFSDMFreq_Value=120000000 +RCC.DIVM1=5 +RCC.DIVN1=192 +RCC.DIVP1Freq_Value=480000000 +RCC.DIVP2Freq_Value=50390625 +RCC.DIVP3Freq_Value=50390625 +RCC.DIVQ1=4 +RCC.DIVQ1Freq_Value=240000000 +RCC.DIVQ2Freq_Value=50390625 +RCC.DIVQ3Freq_Value=50390625 +RCC.DIVR1Freq_Value=480000000 +RCC.DIVR2Freq_Value=50390625 +RCC.DIVR3Freq_Value=50390625 +RCC.FDCANFreq_Value=240000000 +RCC.FMCFreq_Value=240000000 +RCC.FamilyName=M +RCC.HCLK3ClockFreq_Value=240000000 +RCC.HCLKFreq_Value=240000000 +RCC.HPRE=RCC_HCLK_DIV2 +RCC.HRTIMFreq_Value=240000000 +RCC.I2C123Freq_Value=120000000 +RCC.I2C4Freq_Value=120000000 +RCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,D1CPREFreq_Value,D1PPRE,D2PPRE1,D2PPRE2,D3PPRE,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVN1,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1,DIVQ1Freq_Value,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3Freq_Value,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HPRE,HRTIMFreq_Value,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLSourceVirtual,ProductRev,QSPIFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SAI23Freq_Value,SAI4AFreq_Value,SAI4BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value +RCC.LPTIM1Freq_Value=120000000 +RCC.LPTIM2Freq_Value=120000000 +RCC.LPTIM345Freq_Value=120000000 +RCC.LPUART1Freq_Value=120000000 +RCC.LTDCFreq_Value=50390625 +RCC.MCO1PinFreq_Value=64000000 +RCC.MCO2PinFreq_Value=480000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.ProductRev=revV +RCC.QSPIFreq_Value=240000000 +RCC.RNGFreq_Value=48000000 +RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE +RCC.RTCFreq_Value=32768 +RCC.SAI1Freq_Value=240000000 +RCC.SAI23Freq_Value=240000000 +RCC.SAI4AFreq_Value=240000000 +RCC.SAI4BFreq_Value=240000000 +RCC.SDMMCFreq_Value=240000000 +RCC.SPDIFRXFreq_Value=240000000 +RCC.SPI123Freq_Value=240000000 +RCC.SPI45Freq_Value=120000000 +RCC.SPI6Freq_Value=120000000 +RCC.SWPMI1Freq_Value=120000000 +RCC.SYSCLKFreq_VALUE=480000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.Tim1OutputFreq_Value=240000000 +RCC.Tim2OutputFreq_Value=240000000 +RCC.TraceFreq_Value=480000000 +RCC.USART16Freq_Value=120000000 +RCC.USART234578Freq_Value=120000000 +RCC.USBFreq_Value=240000000 +RCC.VCO1OutputFreq_Value=960000000 +RCC.VCO2OutputFreq_Value=100781250 +RCC.VCO3OutputFreq_Value=100781250 +RCC.VCOInput1Freq_Value=5000000 +RCC.VCOInput2Freq_Value=781250 +RCC.VCOInput3Freq_Value=781250 +SDMMC1.ClockDiv=6 +SDMMC1.IPParameters=ClockDiv +SPI4.CalculateBaudRate=60.0 MBits/s +SPI4.DataSize=SPI_DATASIZE_8BIT +SPI4.Direction=SPI_DIRECTION_2LINES_TXONLY +SPI4.FifoThreshold=SPI_FIFO_THRESHOLD_02DATA +SPI4.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS,DataSize,FifoThreshold,TIMode +SPI4.Mode=SPI_MODE_MASTER +SPI4.TIMode=SPI_TIMODE_DISABLE +SPI4.VirtualNSS=VM_NSSHARD +SPI4.VirtualType=VM_MASTER +USART1.IPParameters=VirtualMode-Asynchronous +USART1.VirtualMode-Asynchronous=VM_ASYNC +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=custom diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..4f2abc6613 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,69 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32h7xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/stm32h7xx_hal_conf.h b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/stm32h7xx_hal_conf.h new file mode 100644 index 0000000000..4386bf9383 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/stm32h7xx_hal_conf.h @@ -0,0 +1,515 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h7xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32H7xx_HAL_CONF_H +#define STM32H7xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED + + /* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_FDCAN_MODULE_ENABLED */ +/* #define HAL_FMAC_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_COMP_MODULE_ENABLED */ +/* #define HAL_CORDIC_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +#define HAL_DCMI_MODULE_ENABLED +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +/* #define HAL_ETH_LEGACY_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_OTFDEC_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +/* #define HAL_HRTIM_MODULE_ENABLED */ +/* #define HAL_HSEM_MODULE_ENABLED */ +/* #define HAL_GFXMMU_MODULE_ENABLED */ +/* #define HAL_JPEG_MODULE_ENABLED */ +/* #define HAL_OPAMP_MODULE_ENABLED */ +/* #define HAL_OSPI_MODULE_ENABLED */ +/* #define HAL_OSPI_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +#define HAL_QSPI_MODULE_ENABLED +/* #define HAL_RAMECC_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED +/* #define HAL_SAI_MODULE_ENABLED */ +#define HAL_SD_MODULE_ENABLED +/* #define HAL_MMC_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +/* #define HAL_SWPMI_MODULE_ENABLED */ +/* #define HAL_TIM_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +/* #define HAL_JPEG_MODULE_ENABLED */ +/* #define HAL_MDIOS_MODULE_ENABLED */ +/* #define HAL_PSSI_MODULE_ENABLED */ +/* #define HAL_DTS_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_MDMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_HSEM_MODULE_ENABLED + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) +#define HSE_VALUE (25000000UL) /*!< Value of the External oscillator in Hz : FPGA case fixed to 60MHZ */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal oscillator (CSI) default value. + * This value is the default CSI value after Reset. + */ +#if !defined (CSI_VALUE) + #define CSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE (64000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE (32768UL) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +#if !defined (LSI_VALUE) + #define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE 12288000UL /*!< Value of the External clock in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* 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. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority */ +#define USE_RTOS 0 +#define USE_SD_TRANSCEIVER 0U /*!< use uSD Transceiver */ +#define USE_SPI_CRC 0U /*!< use CRC in SPI */ + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U /* COMP register callback disabled */ +#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U /* CORDIC register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_DTS_REGISTER_CALLBACKS 0U /* DTS register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U /* FDCAN register callback disabled */ +#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U /* FMAC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_GFXMMU_REGISTER_CALLBACKS 0U /* GFXMMU register callback disabled */ +#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U /* HRTIM register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_JPEG_REGISTER_CALLBACKS 0U /* JPEG register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ +#define USE_HAL_MDIOS_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */ +#define USE_HAL_OSPI_REGISTER_CALLBACKS 0U /* OSPI register callback disabled */ +#define USE_HAL_OTFDEC_REGISTER_CALLBACKS 0U /* OTFDEC register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U /* SWPMI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################### Ethernet Configuration ######################### */ +#define ETH_TX_DESC_CNT 4U /* number of Ethernet Tx DMA descriptors */ +#define ETH_RX_DESC_CNT 4U /* number of Ethernet Rx DMA descriptors */ + +#define ETH_MAC_ADDR0 (0x02UL) +#define ETH_MAC_ADDR1 (0x00UL) +#define ETH_MAC_ADDR2 (0x00UL) +#define ETH_MAC_ADDR3 (0x00UL) +#define ETH_MAC_ADDR4 (0x00UL) +#define ETH_MAC_ADDR5 (0x00UL) + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32h7xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32h7xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32h7xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_MDMA_MODULE_ENABLED + #include "stm32h7xx_hal_mdma.h" +#endif /* HAL_MDMA_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32h7xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32h7xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32h7xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32h7xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32h7xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_DTS_MODULE_ENABLED + #include "stm32h7xx_hal_dts.h" +#endif /* HAL_DTS_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32h7xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_ETH_LEGACY_MODULE_ENABLED + #include "stm32h7xx_hal_eth_legacy.h" +#endif /* HAL_ETH_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32h7xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32h7xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32h7xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_FDCAN_MODULE_ENABLED + #include "stm32h7xx_hal_fdcan.h" +#endif /* HAL_FDCAN_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32h7xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32h7xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CORDIC_MODULE_ENABLED + #include "stm32h7xx_hal_cordic.h" +#endif /* HAL_CORDIC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32h7xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32h7xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32h7xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32h7xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_GFXMMU_MODULE_ENABLED + #include "stm32h7xx_hal_gfxmmu.h" +#endif /* HAL_GFXMMU_MODULE_ENABLED */ + +#ifdef HAL_FMAC_MODULE_ENABLED + #include "stm32h7xx_hal_fmac.h" +#endif /* HAL_FMAC_MODULE_ENABLED */ + +#ifdef HAL_HRTIM_MODULE_ENABLED + #include "stm32h7xx_hal_hrtim.h" +#endif /* HAL_HRTIM_MODULE_ENABLED */ + +#ifdef HAL_HSEM_MODULE_ENABLED + #include "stm32h7xx_hal_hsem.h" +#endif /* HAL_HSEM_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32h7xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32h7xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32h7xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32h7xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32h7xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32h7xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_JPEG_MODULE_ENABLED + #include "stm32h7xx_hal_jpeg.h" +#endif /* HAL_JPEG_MODULE_ENABLED */ + +#ifdef HAL_MDIOS_MODULE_ENABLED + #include "stm32h7xx_hal_mdios.h" +#endif /* HAL_MDIOS_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32h7xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32h7xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED +#include "stm32h7xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED +#include "stm32h7xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_OSPI_MODULE_ENABLED + #include "stm32h7xx_hal_ospi.h" +#endif /* HAL_OSPI_MODULE_ENABLED */ + +#ifdef HAL_OTFDEC_MODULE_ENABLED +#include "stm32h7xx_hal_otfdec.h" +#endif /* HAL_OTFDEC_MODULE_ENABLED */ + +#ifdef HAL_PSSI_MODULE_ENABLED + #include "stm32h7xx_hal_pssi.h" +#endif /* HAL_PSSI_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32h7xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32h7xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RAMECC_MODULE_ENABLED + #include "stm32h7xx_hal_ramecc.h" +#endif /* HAL_RAMECC_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32h7xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32h7xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32h7xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32h7xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32h7xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32h7xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32h7xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_SWPMI_MODULE_ENABLED + #include "stm32h7xx_hal_swpmi.h" +#endif /* HAL_SWPMI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32h7xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32h7xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32h7xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32h7xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32h7xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32h7xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32h7xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32h7xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32h7xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +/* 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)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t *file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32H7xx_HAL_CONF_H */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/stm32h7xx_it.h b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/stm32h7xx_it.h new file mode 100644 index 0000000000..16e114c34f --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Inc/stm32h7xx_it.h @@ -0,0 +1,68 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h7xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32H7xx_IT_H +#define __STM32H7xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void SDMMC1_IRQHandler(void); +void DCMI_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32H7xx_IT_H */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..b951cfb728 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/main.c @@ -0,0 +1,493 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ + +DCMI_HandleTypeDef hdcmi; + +QSPI_HandleTypeDef hqspi; + +RTC_HandleTypeDef hrtc; + +SD_HandleTypeDef hsd1; + +SPI_HandleTypeDef hspi4; + +UART_HandleTypeDef huart1; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_QUADSPI_Init(void); +static void MX_DCMI_Init(void); +static void MX_RTC_Init(void); +static void MX_SDMMC1_SD_Init(void); +static void MX_USART1_UART_Init(void); +static void MX_SPI4_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* Enable I-Cache---------------------------------------------------------*/ + SCB_EnableICache(); + + /* Enable D-Cache---------------------------------------------------------*/ + SCB_EnableDCache(); + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_QUADSPI_Init(); + MX_DCMI_Init(); + MX_RTC_Init(); + MX_SDMMC1_SD_Init(); + MX_USART1_UART_Init(); + MX_SPI4_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Supply configuration update enable + */ + HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); + + /** Configure the main internal regulator output voltage + */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0); + + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} + + /** Configure LSE Drive Capability + */ + HAL_PWR_EnableBkUpAccess(); + __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 5; + RCC_OscInitStruct.PLL.PLLN = 192; + RCC_OscInitStruct.PLL.PLLP = 2; + RCC_OscInitStruct.PLL.PLLQ = 4; + RCC_OscInitStruct.PLL.PLLR = 2; + RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; + RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; + RCC_OscInitStruct.PLL.PLLFRACN = 0; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 + |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; + RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; + RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief DCMI Initialization Function + * @param None + * @retval None + */ +static void MX_DCMI_Init(void) +{ + + /* USER CODE BEGIN DCMI_Init 0 */ + + /* USER CODE END DCMI_Init 0 */ + + /* USER CODE BEGIN DCMI_Init 1 */ + + /* USER CODE END DCMI_Init 1 */ + hdcmi.Instance = DCMI; + hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; + hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; + hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW; + hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW; + hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME; + hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; + hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE; + hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL; + hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD; + hdcmi.Init.LineSelectMode = DCMI_LSM_ALL; + hdcmi.Init.LineSelectStart = DCMI_OELS_ODD; + if (HAL_DCMI_Init(&hdcmi) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN DCMI_Init 2 */ + + /* USER CODE END DCMI_Init 2 */ + +} + +/** + * @brief QUADSPI Initialization Function + * @param None + * @retval None + */ +static void MX_QUADSPI_Init(void) +{ + + /* USER CODE BEGIN QUADSPI_Init 0 */ + + /* USER CODE END QUADSPI_Init 0 */ + + /* USER CODE BEGIN QUADSPI_Init 1 */ + + /* USER CODE END QUADSPI_Init 1 */ + /* QUADSPI parameter configuration*/ + hqspi.Instance = QUADSPI; + hqspi.Init.ClockPrescaler = 1; + hqspi.Init.FifoThreshold = 32; + hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE; + hqspi.Init.FlashSize = 22; + hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE; + hqspi.Init.ClockMode = QSPI_CLOCK_MODE_3; + hqspi.Init.FlashID = QSPI_FLASH_ID_1; + hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE; + if (HAL_QSPI_Init(&hqspi) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN QUADSPI_Init 2 */ + + /* USER CODE END QUADSPI_Init 2 */ + +} + +/** + * @brief RTC Initialization Function + * @param None + * @retval None + */ +static void MX_RTC_Init(void) +{ + + /* USER CODE BEGIN RTC_Init 0 */ + + /* USER CODE END RTC_Init 0 */ + + /* USER CODE BEGIN RTC_Init 1 */ + + /* USER CODE END RTC_Init 1 */ + + /** Initialize RTC Only + */ + hrtc.Instance = RTC; + hrtc.Init.HourFormat = RTC_HOURFORMAT_24; + hrtc.Init.AsynchPrediv = 127; + hrtc.Init.SynchPrediv = 255; + hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; + hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; + if (HAL_RTC_Init(&hrtc) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN RTC_Init 2 */ + + /* USER CODE END RTC_Init 2 */ + +} + +/** + * @brief SDMMC1 Initialization Function + * @param None + * @retval None + */ +static void MX_SDMMC1_SD_Init(void) +{ + + /* USER CODE BEGIN SDMMC1_Init 0 */ + + /* USER CODE END SDMMC1_Init 0 */ + + /* USER CODE BEGIN SDMMC1_Init 1 */ + + /* USER CODE END SDMMC1_Init 1 */ + hsd1.Instance = SDMMC1; + hsd1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING; + hsd1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE; + hsd1.Init.BusWide = SDMMC_BUS_WIDE_4B; + hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE; + hsd1.Init.ClockDiv = 6; + if (HAL_SD_Init(&hsd1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SDMMC1_Init 2 */ + + /* USER CODE END SDMMC1_Init 2 */ + +} + +/** + * @brief SPI4 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI4_Init(void) +{ + + /* USER CODE BEGIN SPI4_Init 0 */ + + /* USER CODE END SPI4_Init 0 */ + + /* USER CODE BEGIN SPI4_Init 1 */ + + /* USER CODE END SPI4_Init 1 */ + /* SPI4 parameter configuration*/ + hspi4.Instance = SPI4; + hspi4.Init.Mode = SPI_MODE_MASTER; + hspi4.Init.Direction = SPI_DIRECTION_2LINES_TXONLY; + hspi4.Init.DataSize = SPI_DATASIZE_8BIT; + hspi4.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi4.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi4.Init.NSS = SPI_NSS_HARD_OUTPUT; + hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi4.Init.TIMode = SPI_TIMODE_DISABLE; + hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi4.Init.CRCPolynomial = 0x0; + hspi4.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; + hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_02DATA; + hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; + hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; + hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; + hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; + hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; + hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; + hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE; + if (HAL_SPI_Init(&hspi4) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI4_Init 2 */ + + /* USER CODE END SPI4_Init 2 */ + +} + +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1; + huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ +/* USER CODE BEGIN MX_GPIO_Init_1 */ +/* USER CODE END MX_GPIO_Init_1 */ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + +/* USER CODE BEGIN MX_GPIO_Init_2 */ +/* USER CODE END MX_GPIO_Init_2 */ +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/stm32h7xx_hal_msp.c b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/stm32h7xx_hal_msp.c new file mode 100644 index 0000000000..abd75753aa --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/stm32h7xx_hal_msp.c @@ -0,0 +1,643 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h7xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ +#include "drv_common.h" +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief DCMI MSP Initialization +* This function configures the hardware resources used in this example +* @param hdcmi: DCMI handle pointer +* @retval None +*/ +void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hdcmi->Instance==DCMI) + { + /* USER CODE BEGIN DCMI_MspInit 0 */ + + /* USER CODE END DCMI_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_DCMI_CLK_ENABLE(); + + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**DCMI GPIO Configuration + PE4 ------> DCMI_D4 + PE5 ------> DCMI_D6 + PE6 ------> DCMI_D7 + PA4 ------> DCMI_HSYNC + PA6 ------> DCMI_PIXCLK + PC6 ------> DCMI_D0 + PC7 ------> DCMI_D1 + PD3 ------> DCMI_D5 + PB7 ------> DCMI_VSYNC + PE0 ------> DCMI_D2 + PE1 ------> DCMI_D3 + */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_0 + |GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* DCMI interrupt Init */ + HAL_NVIC_SetPriority(DCMI_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DCMI_IRQn); + /* USER CODE BEGIN DCMI_MspInit 1 */ + + /* USER CODE END DCMI_MspInit 1 */ + } + +} + +/** +* @brief DCMI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hdcmi: DCMI handle pointer +* @retval None +*/ +void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi) +{ + if(hdcmi->Instance==DCMI) + { + /* USER CODE BEGIN DCMI_MspDeInit 0 */ + + /* USER CODE END DCMI_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_DCMI_CLK_DISABLE(); + + /**DCMI GPIO Configuration + PE4 ------> DCMI_D4 + PE5 ------> DCMI_D6 + PE6 ------> DCMI_D7 + PA4 ------> DCMI_HSYNC + PA6 ------> DCMI_PIXCLK + PC6 ------> DCMI_D0 + PC7 ------> DCMI_D1 + PD3 ------> DCMI_D5 + PB7 ------> DCMI_VSYNC + PE0 ------> DCMI_D2 + PE1 ------> DCMI_D3 + */ + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_0 + |GPIO_PIN_1); + + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_6|GPIO_PIN_7); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_3); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); + + /* DCMI interrupt DeInit */ + HAL_NVIC_DisableIRQ(DCMI_IRQn); + /* USER CODE BEGIN DCMI_MspDeInit 1 */ + + /* USER CODE END DCMI_MspDeInit 1 */ + } + +} + +/** +* @brief QSPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hqspi: QSPI handle pointer +* @retval None +*/ +void HAL_QSPI_MspInit(QSPI_HandleTypeDef* hqspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(hqspi->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspInit 0 */ + + /* USER CODE END QUADSPI_MspInit 0 */ + + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_QSPI; + PeriphClkInitStruct.QspiClockSelection = RCC_QSPICLKSOURCE_D1HCLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_QSPI_CLK_ENABLE(); + + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**QUADSPI GPIO Configuration + PE2 ------> QUADSPI_BK1_IO2 + PB2 ------> QUADSPI_CLK + PD11 ------> QUADSPI_BK1_IO0 + PD12 ------> QUADSPI_BK1_IO1 + PD13 ------> QUADSPI_BK1_IO3 + PB6 ------> QUADSPI_BK1_NCS + */ + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN QUADSPI_MspInit 1 */ + + /* USER CODE END QUADSPI_MspInit 1 */ + } + +} + +/** +* @brief QSPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hqspi: QSPI handle pointer +* @retval None +*/ +void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef* hqspi) +{ + if(hqspi->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspDeInit 0 */ + + /* USER CODE END QUADSPI_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_QSPI_CLK_DISABLE(); + + /**QUADSPI GPIO Configuration + PE2 ------> QUADSPI_BK1_IO2 + PB2 ------> QUADSPI_CLK + PD11 ------> QUADSPI_BK1_IO0 + PD12 ------> QUADSPI_BK1_IO1 + PD13 ------> QUADSPI_BK1_IO3 + PB6 ------> QUADSPI_BK1_NCS + */ + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_2); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_2|GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13); + + /* USER CODE BEGIN QUADSPI_MspDeInit 1 */ + + /* USER CODE END QUADSPI_MspDeInit 1 */ + } + +} + +/** +* @brief RTC MSP Initialization +* This function configures the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) +{ + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspInit 0 */ + + /* USER CODE END RTC_MspInit 0 */ + + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_RTC_ENABLE(); + /* USER CODE BEGIN RTC_MspInit 1 */ + + /* USER CODE END RTC_MspInit 1 */ + } + +} + +/** +* @brief RTC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspDeInit 0 */ + + /* USER CODE END RTC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RTC_DISABLE(); + /* USER CODE BEGIN RTC_MspDeInit 1 */ + + /* USER CODE END RTC_MspDeInit 1 */ + } + +} + +/** +* @brief SD MSP Initialization +* This function configures the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspInit(SD_HandleTypeDef* hsd) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(hsd->Instance==SDMMC1) + { + /* USER CODE BEGIN SDMMC1_MspInit 0 */ + + /* USER CODE END SDMMC1_MspInit 0 */ + + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SDMMC; + PeriphClkInitStruct.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_PLL; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_SDMMC1_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**SDMMC1 GPIO Configuration + PC8 ------> SDMMC1_D0 + PC9 ------> SDMMC1_D1 + PC10 ------> SDMMC1_D2 + PC11 ------> SDMMC1_D3 + PC12 ------> SDMMC1_CK + PD2 ------> SDMMC1_CMD + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* SDMMC1 interrupt Init */ + HAL_NVIC_SetPriority(SDMMC1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(SDMMC1_IRQn); + /* USER CODE BEGIN SDMMC1_MspInit 1 */ + + /* USER CODE END SDMMC1_MspInit 1 */ + } + +} + +/** +* @brief SD MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd) +{ + if(hsd->Instance==SDMMC1) + { + /* USER CODE BEGIN SDMMC1_MspDeInit 0 */ + + /* USER CODE END SDMMC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SDMMC1_CLK_DISABLE(); + + /**SDMMC1 GPIO Configuration + PC8 ------> SDMMC1_D0 + PC9 ------> SDMMC1_D1 + PC10 ------> SDMMC1_D2 + PC11 ------> SDMMC1_D3 + PC12 ------> SDMMC1_CK + PD2 ------> SDMMC1_CMD + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2); + + /* SDMMC1 interrupt DeInit */ + HAL_NVIC_DisableIRQ(SDMMC1_IRQn); + /* USER CODE BEGIN SDMMC1_MspDeInit 1 */ + + /* USER CODE END SDMMC1_MspDeInit 1 */ + } + +} + +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(hspi->Instance==SPI4) + { + /* USER CODE BEGIN SPI4_MspInit 0 */ + + /* USER CODE END SPI4_MspInit 0 */ + + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI4; + PeriphClkInitStruct.Spi45ClockSelection = RCC_SPI45CLKSOURCE_D2PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_SPI4_CLK_ENABLE(); + + __HAL_RCC_GPIOE_CLK_ENABLE(); + /**SPI4 GPIO Configuration + PE11 ------> SPI4_NSS + PE12 ------> SPI4_SCK + PE14 ------> SPI4_MOSI + */ + // GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_14; + // GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + // GPIO_InitStruct.Pull = GPIO_NOPULL; + // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + // GPIO_InitStruct.Alternate = GPIO_AF5_SPI4; + // HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI4_MspInit 1 */ + + /**SPI4 GPIO Configuration + PE11 ------> soft CS + PE12 ------> SPI4_SCK + PE14 ------> SPI4_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_14; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI4; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /* USER CODE END SPI4_MspInit 1 */ + } + +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + if(hspi->Instance==SPI4) + { + /* USER CODE BEGIN SPI4_MspDeInit 0 */ + + /* USER CODE END SPI4_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI4_CLK_DISABLE(); + + /**SPI4 GPIO Configuration + PE11 ------> SPI4_NSS + PE12 ------> SPI4_SCK + PE14 ------> SPI4_MOSI + */ + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_14); + + /* USER CODE BEGIN SPI4_MspDeInit 1 */ + + /* USER CODE END SPI4_MspDeInit 1 */ + } + +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspInit 0 */ + + /* USER CODE END USART1_MspInit 0 */ + + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1; + PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_USART1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART1_MspInit 1 */ + + /* USER CODE END USART1_MspInit 1 */ + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspDeInit 0 */ + + /* USER CODE END USART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART1_CLK_DISABLE(); + + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); + + /* USER CODE BEGIN USART1_MspDeInit 1 */ + + /* USER CODE END USART1_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/stm32h7xx_it.c b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/stm32h7xx_it.c new file mode 100644 index 0000000000..33cff451db --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/stm32h7xx_it.c @@ -0,0 +1,232 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h7xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32h7xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern DCMI_HandleTypeDef hdcmi; +extern SD_HandleTypeDef hsd1; +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) + { + } + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Pre-fetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32H7xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32h7xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles SDMMC1 global interrupt. + */ +void SDMMC1_IRQHandler(void) +{ + /* USER CODE BEGIN SDMMC1_IRQn 0 */ + + /* USER CODE END SDMMC1_IRQn 0 */ + HAL_SD_IRQHandler(&hsd1); + /* USER CODE BEGIN SDMMC1_IRQn 1 */ + + /* USER CODE END SDMMC1_IRQn 1 */ +} + +/** + * @brief This function handles DCMI global interrupt. + */ +void DCMI_IRQHandler(void) +{ + /* USER CODE BEGIN DCMI_IRQn 0 */ + + /* USER CODE END DCMI_IRQn 0 */ + HAL_DCMI_IRQHandler(&hdcmi); + /* USER CODE BEGIN DCMI_IRQn 1 */ + + /* USER CODE END DCMI_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/system_stm32h7xx.c b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/system_stm32h7xx.c new file mode 100644 index 0000000000..86e678475c --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/CubeMX_Config/Src/system_stm32h7xx.c @@ -0,0 +1,450 @@ +/** + ****************************************************************************** + * @file system_stm32h7xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-Mx Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32h7xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock, it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32h7xx_system + * @{ + */ + +/** @addtogroup STM32H7xx_System_Private_Includes + * @{ + */ + +#include "stm32h7xx.h" +#include + +#if !defined (HSE_VALUE) +#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (CSI_VALUE) + #define CSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)64000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + + +/** + * @} + */ + +/** @addtogroup STM32H7xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32H7xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use initialized data in D2 domain SRAM (AHB SRAM) */ +/* #define DATA_IN_D2_SRAM */ + +/* Note: Following vector table addresses must be defined in line with linker + configuration. */ +/*!< Uncomment the following line if you need to relocate the vector table + anywhere in FLASH BANK1 or AXI SRAM, else the vector table is kept at the automatic + remap of boot address selected */ +/* #define USER_VECT_TAB_ADDRESS */ + +#if defined(USER_VECT_TAB_ADDRESS) +#if defined(DUAL_CORE) && defined(CORE_CM4) +/*!< Uncomment the following line if you need to relocate your vector Table + in D2 AXI SRAM else user remap will be done in FLASH BANK2. */ +/* #define VECT_TAB_SRAM */ +#if defined(VECT_TAB_SRAM) +#define VECT_TAB_BASE_ADDRESS D2_AXISRAM_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x400. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x400. */ +#else +#define VECT_TAB_BASE_ADDRESS FLASH_BANK2_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x400. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x400. */ +#endif /* VECT_TAB_SRAM */ +#else +/*!< Uncomment the following line if you need to relocate your vector Table + in D1 AXI SRAM else user remap will be done in FLASH BANK1. */ +/* #define VECT_TAB_SRAM */ +#if defined(VECT_TAB_SRAM) +#define VECT_TAB_BASE_ADDRESS D1_AXISRAM_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x400. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x400. */ +#else +#define VECT_TAB_BASE_ADDRESS FLASH_BANK1_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x400. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x400. */ +#endif /* VECT_TAB_SRAM */ +#endif /* DUAL_CORE && CORE_CM4 */ +#endif /* USER_VECT_TAB_ADDRESS */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32H7xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32H7xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 64000000; + uint32_t SystemD2Clock = 64000000; + const uint8_t D1CorePrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; + +/** + * @} + */ + +/** @addtogroup STM32H7xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32H7xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting and vector table location + * configuration. + * @param None + * @retval None + */ +void SystemInit (void) +{ +#if defined (DATA_IN_D2_SRAM) + __IO uint32_t tmpreg; +#endif /* DATA_IN_D2_SRAM */ + + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */ + #endif + /* Reset the RCC clock configuration to the default reset state ------------*/ + + /* Increasing the CPU frequency */ + if(FLASH_LATENCY_DEFAULT > (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY))) + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT)); + } + + /* Set HSION bit */ + RCC->CR |= RCC_CR_HSION; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, HSECSSON, CSION, HSI48ON, CSIKERON, PLL1ON, PLL2ON and PLL3ON bits */ + RCC->CR &= 0xEAF6ED7FU; + + /* Decreasing the number of wait states because of lower CPU frequency */ + if(FLASH_LATENCY_DEFAULT < (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY))) + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT)); + } + +#if defined(D3_SRAM_BASE) + /* Reset D1CFGR register */ + RCC->D1CFGR = 0x00000000; + + /* Reset D2CFGR register */ + RCC->D2CFGR = 0x00000000; + + /* Reset D3CFGR register */ + RCC->D3CFGR = 0x00000000; +#else + /* Reset CDCFGR1 register */ + RCC->CDCFGR1 = 0x00000000; + + /* Reset CDCFGR2 register */ + RCC->CDCFGR2 = 0x00000000; + + /* Reset SRDCFGR register */ + RCC->SRDCFGR = 0x00000000; +#endif + /* Reset PLLCKSELR register */ + RCC->PLLCKSELR = 0x02020200; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x01FF0000; + /* Reset PLL1DIVR register */ + RCC->PLL1DIVR = 0x01010280; + /* Reset PLL1FRACR register */ + RCC->PLL1FRACR = 0x00000000; + + /* Reset PLL2DIVR register */ + RCC->PLL2DIVR = 0x01010280; + + /* Reset PLL2FRACR register */ + + RCC->PLL2FRACR = 0x00000000; + /* Reset PLL3DIVR register */ + RCC->PLL3DIVR = 0x01010280; + + /* Reset PLL3FRACR register */ + RCC->PLL3FRACR = 0x00000000; + + /* Reset HSEBYP bit */ + RCC->CR &= 0xFFFBFFFFU; + + /* Disable all interrupts */ + RCC->CIER = 0x00000000; + +#if (STM32H7_DEV_ID == 0x450UL) + /* dual core CM7 or single core line */ + if((DBGMCU->IDCODE & 0xFFFF0000U) < 0x20000000U) + { + /* if stm32h7 revY*/ + /* Change the switch matrix read issuing capability to 1 for the AXI SRAM target (Target 7) */ + *((__IO uint32_t*)0x51008108) = 0x000000001U; + } +#endif /* STM32H7_DEV_ID */ + +#if defined(DATA_IN_D2_SRAM) + /* in case of initialized data in D2 SRAM (AHB SRAM), enable the D2 SRAM clock (AHB SRAM clock) */ +#if defined(RCC_AHB2ENR_D2SRAM3EN) + RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN | RCC_AHB2ENR_D2SRAM3EN); +#elif defined(RCC_AHB2ENR_D2SRAM2EN) + RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN); +#else + RCC->AHB2ENR |= (RCC_AHB2ENR_AHBSRAM1EN | RCC_AHB2ENR_AHBSRAM2EN); +#endif /* RCC_AHB2ENR_D2SRAM3EN */ + + tmpreg = RCC->AHB2ENR; + (void) tmpreg; +#endif /* DATA_IN_D2_SRAM */ + +#if defined(DUAL_CORE) && defined(CORE_CM4) + /* Configure the Vector Table location add offset address for cortex-M4 ------------------*/ +#if defined(USER_VECT_TAB_ADDRESS) + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal D2 AXI-RAM or in Internal FLASH */ +#endif /* USER_VECT_TAB_ADDRESS */ + +#else + /* + * Disable the FMC bank1 (enabled after reset). + * This, prevents CPU speculation access on this bank which blocks the use of FMC during + * 24us. During this time the others FMC master (such as LTDC) cannot use it! + */ + FMC_Bank1_R->BTCR[0] = 0x000030D2; + + /* Configure the Vector Table location -------------------------------------*/ +#if defined(USER_VECT_TAB_ADDRESS) + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal D1 AXI-RAM or in Internal FLASH */ +#endif /* USER_VECT_TAB_ADDRESS */ + +#endif /*DUAL_CORE && CORE_CM4*/ +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock , it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is CSI, SystemCoreClock will contain the CSI_VALUE(*) + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * - If SYSCLK source is PLL, SystemCoreClock will contain the CSI_VALUE(*), + * HSI_VALUE(**) or HSE_VALUE(***) multiplied/divided by the PLL factors. + * + * (*) CSI_VALUE is a constant defined in stm32h7xx_hal.h file (default value + * 4 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * (**) HSI_VALUE is a constant defined in stm32h7xx_hal.h file (default value + * 64 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***)HSE_VALUE is a constant defined in stm32h7xx_hal.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * @param None + * @retval None + */ +void SystemCoreClockUpdate (void) +{ + uint32_t pllp, pllsource, pllm, pllfracen, hsivalue, tmp; + uint32_t common_system_clock; + float_t fracn1, pllvco; + + + /* Get SYSCLK source -------------------------------------------------------*/ + + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ + common_system_clock = (uint32_t) (HSI_VALUE >> ((RCC->CR & RCC_CR_HSIDIV)>> 3)); + break; + + case RCC_CFGR_SWS_CSI: /* CSI used as system clock source */ + common_system_clock = CSI_VALUE; + break; + + case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ + common_system_clock = HSE_VALUE; + break; + + case RCC_CFGR_SWS_PLL1: /* PLL1 used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCKSELR & RCC_PLLCKSELR_PLLSRC); + pllm = ((RCC->PLLCKSELR & RCC_PLLCKSELR_DIVM1)>> 4) ; + pllfracen = ((RCC->PLLCFGR & RCC_PLLCFGR_PLL1FRACEN)>>RCC_PLLCFGR_PLL1FRACEN_Pos); + fracn1 = (float_t)(uint32_t)(pllfracen* ((RCC->PLL1FRACR & RCC_PLL1FRACR_FRACN1)>> 3)); + + if (pllm != 0U) + { + switch (pllsource) + { + case RCC_PLLCKSELR_PLLSRC_HSI: /* HSI used as PLL clock source */ + + hsivalue = (HSI_VALUE >> ((RCC->CR & RCC_CR_HSIDIV)>> 3)) ; + pllvco = ( (float_t)hsivalue / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t)0x2000) +(float_t)1 ); + + break; + + case RCC_PLLCKSELR_PLLSRC_CSI: /* CSI used as PLL clock source */ + pllvco = ((float_t)CSI_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t)0x2000) +(float_t)1 ); + break; + + case RCC_PLLCKSELR_PLLSRC_HSE: /* HSE used as PLL clock source */ + pllvco = ((float_t)HSE_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t)0x2000) +(float_t)1 ); + break; + + default: + hsivalue = (HSI_VALUE >> ((RCC->CR & RCC_CR_HSIDIV)>> 3)) ; + pllvco = ((float_t)hsivalue / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t)0x2000) +(float_t)1 ); + break; + } + pllp = (((RCC->PLL1DIVR & RCC_PLL1DIVR_P1) >>9) + 1U ) ; + common_system_clock = (uint32_t)(float_t)(pllvco/(float_t)pllp); + } + else + { + common_system_clock = 0U; + } + break; + + default: + common_system_clock = (uint32_t) (HSI_VALUE >> ((RCC->CR & RCC_CR_HSIDIV)>> 3)); + break; + } + + /* Compute SystemClock frequency --------------------------------------------------*/ +#if defined (RCC_D1CFGR_D1CPRE) + tmp = D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_D1CPRE)>> RCC_D1CFGR_D1CPRE_Pos]; + + /* common_system_clock frequency : CM7 CPU frequency */ + common_system_clock >>= tmp; + + /* SystemD2Clock frequency : CM4 CPU, AXI and AHBs Clock frequency */ + SystemD2Clock = (common_system_clock >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_HPRE)>> RCC_D1CFGR_HPRE_Pos]) & 0x1FU)); + +#else + tmp = D1CorePrescTable[(RCC->CDCFGR1 & RCC_CDCFGR1_CDCPRE)>> RCC_CDCFGR1_CDCPRE_Pos]; + + /* common_system_clock frequency : CM7 CPU frequency */ + common_system_clock >>= tmp; + + /* SystemD2Clock frequency : AXI and AHBs Clock frequency */ + SystemD2Clock = (common_system_clock >> ((D1CorePrescTable[(RCC->CDCFGR1 & RCC_CDCFGR1_HPRE)>> RCC_CDCFGR1_HPRE_Pos]) & 0x1FU)); + +#endif + +#if defined(DUAL_CORE) && defined(CORE_CM4) + SystemCoreClock = SystemD2Clock; +#else + SystemCoreClock = common_system_clock; +#endif /* DUAL_CORE && CORE_CM4 */ +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/Kconfig b/bsp/stm32/stm32h750-fk750m1-vbt6/board/Kconfig new file mode 100644 index 0000000000..d387aa3dd2 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/Kconfig @@ -0,0 +1,132 @@ +menu "Hardware Drivers Config" + +config SOC_STM32H750VBT6 + bool + select SOC_SERIES_STM32H7 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_LCD_SPI + bool "Enable 1.30' 240*240 LCD(ST7789)(not support spi tx dma)" + select BSP_USING_GPIO + select BSP_USING_SPI + select BSP_USING_SPI4 + # select BSP_SPI4_TX_USING_DMA + default n + + config BSP_USING_OV2640 + bool "Enable camera (ov2640)" + select BSP_USING_DCMI + select BSP_USING_I2C + select BSP_USING_I2C1 + default n + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + endif + + config BSP_USING_QSPI + bool "Enable QSPI BUS" + select RT_USING_QSPI + select RT_USING_SPI + default n + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI4 + bool "Enable SPI4 BUS" + default n + + config BSP_SPI4_TX_USING_DMA + bool "Enable SPI4 TX DMA" + depends on BSP_USING_SPI4 + default n + endif + + config BSP_USING_DCMI + bool "Enable DCMI" + default n + + menuconfig BSP_USING_I2C + bool "Enable I2C BUS (software simulation)" + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + default n + if BSP_USING_I2C + menuconfig BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default n + if BSP_USING_I2C1 + comment "Notice: PB8 --> 24; PB9 --> 25" + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 1 176 + default 24 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 1 176 + default 25 + endif + + menuconfig BSP_USING_I2C2 + bool "Enable I2C2 BUS (software simulation)" + default n + if BSP_USING_I2C2 + comment "Notice: PB10 --> 26; PB11 --> 27" + config BSP_I2C2_SCL_PIN + int "i2c2 scl pin number" + range 1 176 + default 26 + config BSP_I2C2_SDA_PIN + int "I2C2 sda pin number" + range 1 176 + default 27 + endif + endif + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + select RT_USING_LIBC + default n + + config BSP_USING_ON_CHIP_FLASH + bool "Enable on-chip FLASH" + default n + + source "../libraries/HAL_Drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/SConscript b/bsp/stm32/stm32h750-fk750m1-vbt6/board/SConscript new file mode 100644 index 0000000000..5936b5165a --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/SConscript @@ -0,0 +1,58 @@ +''' +Author: spaceman +Date: 2023-03-21 02:10:16 +LastEditTime: 2023-03-25 18:59:06 +LastEditors: spaceman +Description: +FilePath: \stm32h750-fk750m1-vbt6\board\SConscript +''' +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +objs = [] +cwd = GetCurrentDir() +list = os.listdir(cwd) + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] +path += [cwd + '/port'] + +# add the general drivers. +src = Glob('board.c') +src += Glob('CubeMX_Config/Src/stm32h7xx_hal_msp.c') + +if GetDepend('BSP_USING_LCD_SPI'): + src = src + ['port/lcd/drv_lcd_spi.c'] + src = src + ['port/lcd/drv_lcd_spi_ext.c'] + path += [cwd + '/port/lcd'] + +if GetDepend('BSP_USING_DCMI'): + src = src + ['port/camera/drv_dcmi.c'] + path += [cwd + '/port/camera'] + +if GetDepend('BSP_USING_OV2640'): + src = src + ['port/camera/drv_ov2640.c'] + path += [cwd + '/port/camera'] + +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + objs = objs + SConscript(os.path.join(item, 'SConscript')) + +startup_path_prefix = SDK_LIB + +if rtconfig.PLATFORM in ['gcc']: + src += [startup_path_prefix + '/STM32H7xx_HAL/CMSIS/Device/ST/STM32H7xx/Source/Templates/gcc/startup_stm32h750xx.s'] +elif rtconfig.PLATFORM in ['armcc', 'armclang']: + src += [startup_path_prefix + '/STM32H7xx_HAL/CMSIS/Device/ST/STM32H7xx/Source/Templates/arm/startup_stm32h750xx.s'] +elif rtconfig.PLATFORM in ['iccarm']: + src += [startup_path_prefix + '/STM32H7xx_HAL/CMSIS/Device/ST/STM32H7xx/Source/Templates/iar/startup_stm32h750xx.s'] + +# STM32H743xx || STM32H750xx || STM32F753xx +# You can select chips from the list above +CPPDEFINES = ['STM32H750xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/board.c b/bsp/stm32/stm32h750-fk750m1-vbt6/board/board.c new file mode 100644 index 0000000000..8cd041a305 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/board.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-24 spaceman the first version + */ + +#include "board.h" + +#define AXI_SRAM_ADDR (0X24000000) +#define AXI_SRAM_SIZE (512*1024) +#define SRAM1_ADDR (0X30000000) +#define SRAM1_SIZE (128*1024) +#define SRAM2_ADDR (0X30020000) +#define SRAM2_SIZE (128*1024) +#define SRAM3_ADDR (0X30040000) +#define SRAM3_SIZE (32*1024) +#define SRAM4_ADDR (0X38000000) +#define SRAM4_SIZE (64*1024) +#define BACKUP_ADDR (0X38800000) +#define BACKUP_SIZE (4*1024) + +static struct rt_memheap _heap_axi_sram; +static struct rt_memheap _heap_sram1; +static struct rt_memheap _heap_sram2; +static struct rt_memheap _heap_sram3; +static struct rt_memheap _heap_sram4; +static struct rt_memheap _heap_backup_sram; + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + + /** Supply configuration update enable + */ + HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); + /** Configure the main internal regulator output voltage + */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0); + + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} + /** Configure LSE Drive Capability + */ + HAL_PWR_EnableBkUpAccess(); + __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 5; + RCC_OscInitStruct.PLL.PLLN = 192; + RCC_OscInitStruct.PLL.PLLP = 2; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; + RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; + RCC_OscInitStruct.PLL.PLLFRACN = 0; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 + |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; + RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; + RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_UART4 + |RCC_PERIPHCLK_USART1; + PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1; + PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } +} + +static int init_sram(void) +{ + __HAL_RCC_D2SRAM1_CLK_ENABLE(); + __HAL_RCC_D2SRAM2_CLK_ENABLE(); + __HAL_RCC_D2SRAM3_CLK_ENABLE(); + rt_memheap_init(&_heap_axi_sram, "axi_sram", (void *)AXI_SRAM_ADDR, AXI_SRAM_SIZE); + rt_memheap_init(&_heap_sram1, "sram1", (void *)SRAM1_ADDR, SRAM1_SIZE); + rt_memheap_init(&_heap_sram2, "sram2", (void *)SRAM2_ADDR, SRAM2_SIZE); + rt_memheap_init(&_heap_sram3, "sram3", (void *)SRAM3_ADDR, SRAM3_SIZE); + rt_memheap_init(&_heap_sram4, "sram4", (void *)SRAM4_ADDR, SRAM4_SIZE); + rt_memheap_init(&_heap_backup_sram, "bak_sram", (void *)BACKUP_ADDR, BACKUP_SIZE); + + return 0; +} +INIT_BOARD_EXPORT(init_sram); + +/** + * Function ota_app_vtor_reconfig + * Description Set Vector Table base location to the start addr of app(RT_APP_PART_ADDR). +*/ +static int ota_app_vtor_reconfig(void) +{ + #define RT_APP_PART_ADDR 0x08020000 + #define NVIC_VTOR_MASK 0x3FFFFF80 + /* Set the Vector Table base location by user application firmware definition */ + SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK; + + return 0; +} +// INIT_BOARD_EXPORT(ota_app_vtor_reconfig); diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/board.h b/bsp/stm32/stm32h750-fk750m1-vbt6/board/board.h new file mode 100644 index 0000000000..cc9f4a7bcd --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/board.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-5 SummerGift first version + * 2020-8-6 NU-LL Add stm32h750vbt6 support + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +// #include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*-------------------------- CHIP CONFIG BEGIN --------------------------*/ + +#define CHIP_FAMILY_STM32 +#define CHIP_SERIES_STM32H7 +#define CHIP_NAME_STM32H750XBHX + +/*-------------------------- CHIP CONFIG END --------------------------*/ + +/*-------------------------- ROM/RAM CONFIG BEGIN --------------------------*/ +#define ROM_START ((uint32_t)0x80000000) +#define ROM_SIZE (128) +#define ROM_END ((uint32_t)(ROM_START + ROM_SIZE * 1024)) + +#define RAM_START (0x20000000)//DTCM_region +#define RAM_SIZE (128) +#define RAM_END (RAM_START + RAM_SIZE * 1024) + +/*-------------------------- ROM/RAM CONFIG END --------------------------*/ + +/*-------------------------- CLOCK CONFIG BEGIN --------------------------*/ + +#define BSP_CLOCK_SOURCE ("HSE") +#define BSP_CLOCK_SOURCE_FREQ_MHZ ((int32_t)0) +#define BSP_CLOCK_SYSTEM_FREQ_MHZ ((int32_t)480) + +/*-------------------------- CLOCK CONFIG END --------------------------*/ + +/*-------------------------- UART CONFIG BEGIN --------------------------*/ + +/** After configuring corresponding UART or UART DMA, you can use it. + * + * STEP 1, define macro define related to the serial port opening based on the serial port number + * such as #define BSP_USING_UATR1 + * + * STEP 2, according to the corresponding pin of serial port, define the related serial port information macro + * such as #define BSP_UART1_TX_PIN "PA9" + * #define BSP_UART1_RX_PIN "PA10" + * + * STEP 3, if you want using SERIAL DMA, you must open it in the RT-Thread Settings. + * RT-Thread Setting -> Components -> Device Drivers -> Serial Device Drivers -> Enable Serial DMA Mode + * + * STEP 4, according to serial port number to define serial port tx/rx DMA function in the board.h file + * such as #define BSP_UART1_RX_USING_DMA + * + */ + +#define BSP_UART1_RX_BUFSIZE 256 +#define BSP_UART1_TX_BUFSIZE 256 + +#define STM32_FLASH_START_ADRESS ROM_START +#define STM32_FLASH_SIZE ROM_SIZE +#define STM32_FLASH_END_ADDRESS ROM_END + +#define STM32_SRAM_SIZE RAM_SIZE +#define STM32_SRAM_START RAM_START +#define STM32_SRAM_END RAM_END + +#if defined(__ARMCC_VERSION) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN (&Image$$RW_IRAM1$$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 STM32_SRAM_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.icf b/bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.icf new file mode 100644 index 0000000000..45e4c7b910 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.icf @@ -0,0 +1,28 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08020000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08020000; +define symbol __ICFEDIT_region_ROM_end__ = 0x08200000; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20020000; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x800; +define symbol __ICFEDIT_size_heap__ = 0x400; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, last block CSTACK}; diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.lds b/bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.lds new file mode 100644 index 0000000000..b758e1db72 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.lds @@ -0,0 +1,157 @@ +/* + * linker script for STM32F4xx with GNU ld + * bernard.xiong 2009-10-14 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08020000, LENGTH = 1920k /* 1920KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128K DTCM */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.sct b/bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.sct new file mode 100644 index 0000000000..e8ee242dea --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x001E0000 { ; load region size_region + ER_IROM1 0x08000000 0x001E0000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x00020000 { ; DTCM 128K + .ANY (+RW +ZI) + } +} diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_dcmi.c b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_dcmi.c new file mode 100644 index 0000000000..a8ab7314a7 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_dcmi.c @@ -0,0 +1,457 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-24 spaceman the first version + */ + +#include "board.h" +#include "drv_dcmi.h" + +#ifdef BSP_USING_DCMI + +#define DRV_DEBUG +#define LOG_TAG "drv.dcmi" +#include + +static struct stm32_dcmi rt_dcmi_dev = {0}; +static volatile uint8_t ov2640_fps; // 帧率 + + +static void rt_hw_dmci_dma_init(struct stm32_dcmi *dcmi_dev) +{ + RT_ASSERT(dcmi_dev != RT_NULL); + DCMI_HandleTypeDef *_dcmi_handle = &dcmi_dev->dcmi_handle; + DMA_HandleTypeDef *_dma_handle = &dcmi_dev->dma_handle; + RT_ASSERT(_dcmi_handle != RT_NULL); + RT_ASSERT(_dma_handle != RT_NULL); + + __HAL_RCC_DMA2_CLK_ENABLE(); // 使能DMA2时钟 + + _dma_handle->Instance = DMA2_Stream7; // DMA2数据流7 + _dma_handle->Init.Request = DMA_REQUEST_DCMI; // DMA请求来自DCMI + _dma_handle->Init.Direction = DMA_PERIPH_TO_MEMORY; // 外设到存储器模式 + _dma_handle->Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址禁止自增 + _dma_handle->Init.MemInc = DMA_MINC_ENABLE; // 存储器地址自增 + _dma_handle->Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; // DCMI数据位宽,32位 + _dma_handle->Init.MemDataAlignment = DMA_MDATAALIGN_WORD; // 存储器数据位宽,32位 + _dma_handle->Init.Mode = DMA_CIRCULAR; // 循环模式 + _dma_handle->Init.Priority = DMA_PRIORITY_LOW; // 优先级低 + _dma_handle->Init.FIFOMode = DMA_FIFOMODE_ENABLE; // 使能fifo + _dma_handle->Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; // 全fifo模式,4*32bit大小 + _dma_handle->Init.MemBurst = DMA_MBURST_SINGLE; // 单次传输 + _dma_handle->Init.PeriphBurst = DMA_PBURST_SINGLE; // 单次传输 + + if (HAL_DMA_Init(_dma_handle) != HAL_OK) { + Error_Handler(); + } + HAL_DMA_Init(_dma_handle); // 配置DMA + __HAL_LINKDMA(_dcmi_handle, DMA_Handle, *_dma_handle); // 关联DCMI句柄 + HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0); // 设置中断优先级 + HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); // 使能中断 +} + +static rt_err_t rt_hw_dcmi_init(struct stm32_dcmi *dcmi_dev) +{ + RT_ASSERT(dcmi_dev != RT_NULL); + DCMI_HandleTypeDef *_dcmi_handle = &dcmi_dev->dcmi_handle; + RT_ASSERT(_dcmi_handle != RT_NULL); + + _dcmi_handle->Instance = DCMI; + _dcmi_handle->Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; // 硬件同步模式,即使用外部的VS、HS信号进行同步 + _dcmi_handle->Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; // 像素时钟上升沿有效 + _dcmi_handle->Init.VSPolarity = DCMI_VSPOLARITY_LOW; // VS低电平有效 + _dcmi_handle->Init.HSPolarity = DCMI_HSPOLARITY_LOW; // HS低电平有效 + _dcmi_handle->Init.CaptureRate = DCMI_CR_ALL_FRAME; // 捕获等级,设置每一帧都进行捕获 + _dcmi_handle->Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; // 8位数据模式 + _dcmi_handle->Init.JPEGMode = DCMI_JPEG_DISABLE; // 禁止JPEG模式 + _dcmi_handle->Init.ByteSelectMode = DCMI_BSM_ALL; // DCMI接口捕捉所有数据 + _dcmi_handle->Init.ByteSelectStart = DCMI_OEBS_ODD; // 选择开始字节,从 帧/行 的第一个数据开始捕获 + _dcmi_handle->Init.LineSelectMode = DCMI_LSM_ALL; // 捕获所有行 + _dcmi_handle->Init.LineSelectStart = DCMI_OELS_ODD; // 选择开始行,在帧开始后捕获第一行 + if (HAL_DCMI_Init(_dcmi_handle) != HAL_OK) { + LOG_E("dcmi init error!"); + return -RT_ERROR; + } + + HAL_NVIC_SetPriority(DCMI_IRQn, 0, 5); // 设置中断优先级 + HAL_NVIC_EnableIRQ(DCMI_IRQn); // 开启DCMI中断 + + DCMI->IER = 0x0; + + // 在JPG模式下,一定要单独使能该中断 + __HAL_DCMI_ENABLE_IT(_dcmi_handle, DCMI_IT_FRAME); + __HAL_DCMI_ENABLE(_dcmi_handle); + + rt_hw_dmci_dma_init(dcmi_dev); + + return RT_EOK; +} + +/*************************************************************************************************************************************** + * 函 数 名: ov2640_dcmi_crop + * + * 入口参数: displey_xsize 、displey_ysize - 显示器的长宽 + * sensor_xsize、sensor_ysize - 摄像头传感器输出图像的长宽 + * + * 函数功能: 使用DCMI的裁剪功能,将传感器输出的图像裁剪成适应屏幕的大小 + * + * 说 明: 1. 因为摄像头输出的画面比例固定为4:3,不一定匹配显示器 + * 2. 需要注意的是,摄像头输出的图像长、宽必须要能被4整除!( 使用OV2640_Set_Framesize函数进行设置 ) + * 3. DCMI的水平有效像素也必须要能被4整除! + * 4. 函数会计算水平和垂直偏移,尽量让画面居中裁剪 + *****************************************************************************************************************************************/ +static rt_err_t ov2640_dcmi_crop(struct stm32_dcmi *dcmi_dev, uint16_t displey_xsize, uint16_t displey_ysize, uint16_t sensor_xsize, uint16_t sensor_ysize) +{ + RT_ASSERT(dcmi_dev != RT_NULL); + DCMI_HandleTypeDef *_dcmi_handle = &dcmi_dev->dcmi_handle; + RT_ASSERT(_dcmi_handle != RT_NULL); + + uint16_t dcmi_x_offset, dcmi_y_offset; // 水平和垂直偏移,垂直代表的是行数,水平代表的是像素时钟数(pclk周期数) + uint16_t dcmi_capcnt; // 水平有效像素,代表的是像素时钟数(pclk周期数) + uint16_t dcmi_vline; // 垂直有效行数 + + if ((displey_xsize >= sensor_xsize) || (displey_ysize >= sensor_ysize)) { + LOG_E("actual displayed size (%d, %d) >= camera output size (%d, %d), exit dcmi cropping", displey_xsize, displey_ysize, sensor_xsize, sensor_ysize); + return -RT_ERROR; // 如果实际显示的尺寸大于或等于摄像头输出的尺寸,则退出当前函数,不进行裁剪 + } + + // 在设置为rgb565格式时,水平偏移,必须是奇数,否则画面色彩不正确, + // 因为一个有效像素是2个字节,需要2个pclk周期,所以必须从奇数位开始,不然数据会错乱, + // 需要注意的是,寄存器值是从0开始算起的 ! + dcmi_x_offset = sensor_xsize - displey_xsize; // 实际计算过程为(sensor_xsize - lcd_xsize)/2*2 + + // 计算垂直偏移,尽量让画面居中裁剪,该值代表的是行数, + dcmi_y_offset = (sensor_ysize - displey_ysize) / 2 - 1; // 寄存器值是从0开始算起的,所以要-1 + + // 因为一个有效像素是2个字节,需要2个pclk周期,所以要乘2 + // 最终得到的寄存器值,必须要能被4整除! + dcmi_capcnt = displey_xsize * 2 - 1; // 寄存器值是从0开始算起的,所以要-1 + + dcmi_vline = displey_ysize - 1; // 垂直有效行数 + + // LOG_D("%d %d %d %d", dcmi_x_offset, dcmi_y_offset, dcmi_capcnt, dcmi_vline); + HAL_DCMI_ConfigCrop(_dcmi_handle, dcmi_x_offset, dcmi_y_offset, dcmi_capcnt, dcmi_vline); // 设置裁剪窗口 + HAL_DCMI_EnableCrop(_dcmi_handle); // 使能裁剪 + + return RT_EOK; +} + +/*************************************************************************************************************************************** + * 函 数 名: ov2640_dma_transmit_continuous + * + * 入口参数: dma_buffer - DMA将要传输的地址,即用于存储摄像头数据的存储区地址 + * dma_buffersize - 传输的数据大小,32位宽 + * + * 函数功能: 启动DMA传输,连续模式 + * + * 说 明: 1. 开启连续模式之后,会一直进行传输,除非挂起或者停止DCMI + * 2. OV2640使用RGB565模式时,1个像素点需要2个字节来存储 + * 3. 因为DMA配置传输数据为32位宽,计算 dma_buffersize 时,需要除以4,例如: + * 要获取 240*240分辨率 的图像,需要传输 240*240*2 = 115200 字节的数据, + * 则 dma_buffersize = 115200 / 4 = 28800 。 + * + *****************************************************************************************************************************************/ +static void ov2640_dma_transmit_continuous(struct stm32_dcmi *dcmi_dev, uint32_t dma_buffer, uint32_t dma_buffersize) +{ + RT_ASSERT(dcmi_dev != RT_NULL); + DCMI_HandleTypeDef *_dcmi_handle = &dcmi_dev->dcmi_handle; + DMA_HandleTypeDef *_dma_handle = &dcmi_dev->dma_handle; + RT_ASSERT(_dcmi_handle != RT_NULL); + RT_ASSERT(_dma_handle != RT_NULL); + + _dma_handle->Init.Mode = DMA_CIRCULAR; // 循环模式 + + HAL_DMA_Init(_dma_handle); // 配置DMA + + // 使能DCMI采集数据,连续采集模式 + HAL_DCMI_Start_DMA(_dcmi_handle, DCMI_MODE_CONTINUOUS, (uint32_t)dma_buffer, dma_buffersize); +} + +/*************************************************************************************************************************************** + * 函 数 名: ov2640_dma_transmit_snapshot + * + * 入口参数: dma_buffer - DMA将要传输的地址,即用于存储摄像头数据的存储区地址 + * dma_buffersize - 传输的数据大小,32位宽 + * + * 函数功能: 启动DMA传输,快照模式,传输一帧图像后停止 + * + * 说 明: 1. 快照模式,只传输一帧的数据 + * 2. OV2640使用RGB565模式时,1个像素点需要2个字节来存储 + * 3. 因为DMA配置传输数据为32位宽,计算 dma_buffersize 时,需要除以4,例如: + * 要获取 240*240分辨率 的图像,需要传输 240*240*2 = 115200 字节的数据, + * 则 dma_buffersize = 115200 / 4 = 28800 。 + * 4. 使用该模式传输完成之后,DCMI会被挂起,再次启用传输之前,需要调用 OV2640_DCMI_Resume() 恢复DCMI + * + *****************************************************************************************************************************************/ +static void ov2640_dma_transmit_snapshot(struct stm32_dcmi *dcmi_dev, uint32_t dma_buffer, uint32_t dma_buffersize) +{ + RT_ASSERT(dcmi_dev != RT_NULL); + DCMI_HandleTypeDef *_dcmi_handle = &dcmi_dev->dcmi_handle; + DMA_HandleTypeDef *_dma_handle = &dcmi_dev->dma_handle; + RT_ASSERT(_dcmi_handle != RT_NULL); + RT_ASSERT(_dma_handle != RT_NULL); + + _dma_handle->Init.Mode = DMA_NORMAL; // 正常模式 + + HAL_DMA_Init(_dma_handle); // 配置DMA + + HAL_DCMI_Start_DMA(_dcmi_handle, DCMI_MODE_SNAPSHOT, (uint32_t)dma_buffer, dma_buffersize); +} + +/*************************************************************************************************************************************** + * 函 数 名: ov2640_dcmi_suspend + * + * 函数功能: 挂起dcmi,停止捕获数据 + * + * 说 明: 1. 开启连续模式之后,再调用该函数,会停止捕获dcmi的数据 + * 2. 可以调用 ov2640_dcmi_resume() 恢复dcmi + * 3. 需要注意的,挂起dcmi期间,dma是没有停止工作的 + *fanke + *****************************************************************************************************************************************/ +static void ov2640_dcmi_suspend(struct stm32_dcmi *dcmi_dev) +{ + RT_ASSERT(dcmi_dev != RT_NULL); + DCMI_HandleTypeDef *_dcmi_handle = &dcmi_dev->dcmi_handle; + RT_ASSERT(_dcmi_handle != RT_NULL); + + HAL_DCMI_Suspend(_dcmi_handle); // 挂起dcmi +} + +/*************************************************************************************************************************************** + * 函 数 名: ov2640_dcmi_resume + * + * 函数功能: 恢复dcmi,开始捕获数据 + * + * 说 明: 1. 当dcmi被挂起时,可以调用该函数恢复 + * 2. 使用 ov2640_dma_transmit_snapshot() 快照模式,传输完成之后,dcmi也会被挂起,再次启用传输之前, + * 需要调用本函数恢复dcmi捕获 + * + *****************************************************************************************************************************************/ +static void ov2640_dcmi_resume(struct stm32_dcmi *dcmi_dev) +{ + RT_ASSERT(dcmi_dev != RT_NULL); + DCMI_HandleTypeDef *_dcmi_handle = &dcmi_dev->dcmi_handle; + RT_ASSERT(_dcmi_handle != RT_NULL); + + _dcmi_handle->State = HAL_DCMI_STATE_BUSY; // 变更dcmi标志 + _dcmi_handle->Instance->CR |= DCMI_CR_CAPTURE; // 开启dcmi捕获 +} + +/*************************************************************************************************************************************** + * 函 数 名: ov2640_dcmi_stop + * + * 函数功能: 禁止dcmi的dma请求,停止dcmi捕获,禁止dcmi外设 + * + *****************************************************************************************************************************************/ +static void ov2640_dcmi_stop(struct stm32_dcmi *dcmi_dev) +{ + RT_ASSERT(dcmi_dev != RT_NULL); + DCMI_HandleTypeDef *_dcmi_handle = &dcmi_dev->dcmi_handle; + RT_ASSERT(_dcmi_handle != RT_NULL); + + HAL_DCMI_Stop(_dcmi_handle); +} + +void DCMI_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + HAL_DCMI_IRQHandler(&rt_dcmi_dev.dcmi_handle); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +void DMA2_Stream7_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + HAL_DMA_IRQHandler(&rt_dcmi_dev.dma_handle); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +/* Capture a frame of the image */ +void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + static uint32_t dcmi_tick = 0; // 用于保存当前的时间计数值 + static uint8_t dcmi_frame_count = 0; // 帧数计数 + if (HAL_GetTick() - dcmi_tick >= 1000) // 每隔 1s 计算一次帧率 + { + dcmi_tick = HAL_GetTick(); // 重新获取当前时间计数值 + ov2640_fps = dcmi_frame_count; // 获得fps + dcmi_frame_count = 0; // 计数清0 + } + dcmi_frame_count++; // 没进入一次中断(每次传输完一帧数据),计数值+1 + + rt_sem_release(&rt_dcmi_dev.cam_semaphore); + /* leave interrupt */ + rt_interrupt_leave(); +} + +void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + if (HAL_DCMI_GetError(hdcmi) == HAL_DCMI_ERROR_OVR) { + LOG_E("FIFO overflow error"); + } + LOG_E("error:0x%08x", HAL_DCMI_GetError(hdcmi)); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +static rt_err_t rt_dcmi_init(rt_device_t dev) +{ + RT_ASSERT(dev != RT_NULL); + rt_err_t result = RT_EOK; + struct stm32_dcmi *_rt_dcmi_dev = DCMI_DEVICE(dev); + + result = rt_hw_dcmi_init(_rt_dcmi_dev); + if (result != RT_EOK) { + return result; + } + + return result; +} + +static rt_err_t rt_dcmi_open(rt_device_t dev, rt_uint16_t oflag) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_err_t rt_dcmi_close(rt_device_t dev) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_err_t rt_dcmi_control(rt_device_t dev, int cmd, void *args) +{ + RT_ASSERT(dev != RT_NULL); + struct stm32_dcmi *_rt_dcmi_dev = DCMI_DEVICE(dev); + + switch (cmd) { + case DCMI_CTRL_CROP: { + RT_ASSERT(args != RT_NULL); + struct stm32_dcmi_cropsize* cropsize = (struct stm32_dcmi_cropsize*)args; + ov2640_dcmi_crop(_rt_dcmi_dev, cropsize->displey_xsize, cropsize->displey_ysize, cropsize->sensor_xsize, cropsize->sensor_ysize); + } break; + case DCMI_CTRL_TRANSMIT_CONTINUOUS: { + RT_ASSERT(args != RT_NULL); + struct stm32_dcmi_dma_transmitbuffer* transmitbuffer = (struct stm32_dcmi_dma_transmitbuffer*)args; + ov2640_dma_transmit_continuous(_rt_dcmi_dev, transmitbuffer->dma_buffer, transmitbuffer->dma_buffersize); + } break; + case DCMI_CTRL_TRANSMIT_SNAPSHOT: { + RT_ASSERT(args != RT_NULL); + struct stm32_dcmi_dma_transmitbuffer* transmitbuffer = (struct stm32_dcmi_dma_transmitbuffer*)args; + ov2640_dma_transmit_snapshot(_rt_dcmi_dev, transmitbuffer->dma_buffer, transmitbuffer->dma_buffersize); + } break; + case DCMI_CTRL_SUSPEND: { + ov2640_dcmi_suspend(_rt_dcmi_dev); + } break; + case DCMI_CTRL_RESUME: { + ov2640_dcmi_resume(_rt_dcmi_dev); + } break; + case DCMI_CTRL_STOP: { + ov2640_dcmi_stop(_rt_dcmi_dev); + } break; + case DCMI_CTRL_GET_FPS: { + *(uint8_t*)args = ov2640_fps; + } break; + + default: + return -RT_EINVAL; + } + + return RT_EOK; +} + +static rt_ssize_t rt_dcmi_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_ssize_t rt_dcmi_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops dcmi_ops = +{ + rt_dcmi_init, + rt_dcmi_open, + rt_dcmi_close, + rt_dcmi_read, + rt_dcmi_write, + rt_dcmi_control, +}; +#endif + +int dcmi_init(void) +{ + int ret = 0; + rt_device_t device = &rt_dcmi_dev.parent; + + /* memset rt_dcmi_dev to zero */ + memset(&rt_dcmi_dev, 0x00, sizeof(rt_dcmi_dev)); + + /* init cam_semaphore semaphore */ + ret = rt_sem_init(&rt_dcmi_dev.cam_semaphore, "cam_sem", 0, RT_IPC_FLAG_FIFO); + if (ret != RT_EOK) { + LOG_E("init semaphore failed!\n"); + ret = -RT_ENOMEM; + goto __exit; + } + + device->type = RT_Device_Class_Miscellaneous; +#ifdef RT_USING_DEVICE_OPS + device->ops = &dcmi_ops; +#else + device->init = rt_dcmi_init; + device->open = rt_dcmi_open; + device->close = rt_dcmi_close; + device->read = rt_dcmi_read; + device->write = rt_dcmi_write; + device->control = rt_dcmi_control; +#endif + device->user_data = RT_NULL; + + ret = rt_device_register(device, "dcmi", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); + if (ret != RT_EOK) { + LOG_E("dcmi registered fail!\n\r"); + return -RT_ERROR; + } + + LOG_I("dcmi init success!"); + + return RT_EOK; +__exit: + if (ret != RT_EOK) { + rt_sem_delete(&rt_dcmi_dev.cam_semaphore); + } + return ret; +} +INIT_BOARD_EXPORT(dcmi_init); + +#endif /* BSP_USING_DCMI */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_dcmi.h b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_dcmi.h new file mode 100644 index 0000000000..1694c1f30b --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_dcmi.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-24 spaceman the first version + */ + +#ifndef __DRV_DCMI_H__ +#define __DRV_DCMI_H__ + +#include +#include "board.h" + +#ifdef BSP_USING_DCMI + +#ifdef __cplusplus +extern "C" { +#endif + +#define DCMI_DEVICE(dev) (struct stm32_dcmi *)(dev) + +#define DCMI_CTRL_CROP (0x01) +#define DCMI_CTRL_TRANSMIT_CONTINUOUS (0x02) +#define DCMI_CTRL_TRANSMIT_SNAPSHOT (0x03) +#define DCMI_CTRL_SUSPEND (0x04) +#define DCMI_CTRL_RESUME (0x05) +#define DCMI_CTRL_STOP (0x06) +#define DCMI_CTRL_GET_FPS (0x07) + +struct stm32_dcmi { + struct rt_device parent; + + DCMI_HandleTypeDef dcmi_handle; + DMA_HandleTypeDef dma_handle; + + struct rt_semaphore cam_semaphore; +}; + +struct stm32_dcmi_cropsize { + uint16_t displey_xsize; + uint16_t displey_ysize; + uint16_t sensor_xsize; + uint16_t sensor_ysize; +}; + +struct stm32_dcmi_dma_transmitbuffer { + uint32_t dma_buffer; + uint32_t dma_buffersize; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* BSP_USING_DCMI */ + +#endif /* __DRV_DCMI_H__ */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640.c b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640.c new file mode 100644 index 0000000000..e6ff82e8c8 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640.c @@ -0,0 +1,538 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-24 spaceman the first version + */ + +#include "board.h" + +#ifdef BSP_USING_OV2640 + +#include +#include +#include +#include +#include +#include "drv_dcmi.h" +#include "drv_ov2640.h" +#include "drv_ov2640_cfg.h" + +#define DRV_DEBUG +//#define CAMERA_DUMP +#define LOG_TAG "drv.ov2640" +#include + +#define CHIP_ADDRESS 0x30 /* OV2640 address */ +// #define CHIP_ADDRESS 0x3C /* OV5640 address */ +#define I2C_NAME "i2c1" +#define PWDN_PIN GET_PIN(D, 14) + +struct rt_i2c_bus_device *i2c_bus = RT_NULL; + +#if defined(CAMERA_DUMP) +#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ') +static void dump_hex(const rt_uint8_t *ptr, rt_size_t buflen) +{ + unsigned char *buf = (unsigned char *)ptr; + int i, j; + + for (i = 0; i < buflen; i += 16) + { + rt_kprintf("%08x:", i); + + for (j = 0; j < 16; j++) + { + if (i + j < buflen) + { + rt_kprintf("%02x", buf[i + j]); + } + else + { + rt_kprintf(" "); + } + } + rt_kprintf(" "); + + for (j = 0; j < 16; j++) + { + if (i + j < buflen) + { + rt_kprintf("%c", __is_print(buf[i + j]) ? buf[i + j] : '.'); + } + } + rt_kprintf("\n"); + } +} +#endif + +/* i2c read reg */ +static rt_err_t read_reg(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t len, rt_uint8_t *buf) +{ + struct rt_i2c_msg msg[2] = {0, 0}; + + RT_ASSERT(bus != RT_NULL); + + msg[0].addr = CHIP_ADDRESS; + msg[0].flags = RT_I2C_WR; + msg[0].buf = ® + msg[0].len = 1; + + msg[1].addr = CHIP_ADDRESS; + msg[1].flags = RT_I2C_RD; + msg[1].len = len; + msg[1].buf = buf; + + if (rt_i2c_transfer(bus, msg, 2) == 2) + { + return RT_EOK; + } + + return -RT_ERROR; +} + +/* i2c write reg */ +static rt_err_t write_reg(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t data) +{ + rt_uint8_t buf[2]; + struct rt_i2c_msg msgs; + + RT_ASSERT(bus != RT_NULL); + + buf[0] = reg; + buf[1] = data; + + msgs.addr = CHIP_ADDRESS; + msgs.flags = RT_I2C_WR; + msgs.buf = buf; + msgs.len = 2; + + if (rt_i2c_transfer(bus, &msgs, 1) == 1) + { + return RT_EOK; + } + + return -RT_ERROR; +} + +static rt_err_t ov2640_read_id(struct rt_i2c_bus_device *bus, rt_uint16_t *id) +{ + rt_uint8_t read_value[2]; + + write_reg(bus, OV2640_SEL_Registers, OV2640_SEL_SENSOR); // 选择 SENSOR 寄存器组 + + read_reg(bus, OV2640_SENSOR_PIDH, 1, &read_value[0]); // 读取ID高字节 + read_reg(bus, OV2640_SENSOR_PIDL, 1, &read_value[1]); // 读取ID低字节 + + *id = ((rt_uint16_t)(read_value[0] << 8) & 0xFF00); + *id |= ((rt_uint16_t)(read_value[1]) & 0x00FF); + + if ((*id != OV2640_ID1) && (*id != OV2640_ID2)) { + LOG_E("ov2640 init error, id: 0x%04x", *id); + return -RT_ERROR; + } + + LOG_I("ov2640 init success, id: 0x%04x", *id); + + return RT_EOK; +} + +static rt_err_t ov2640_reset(struct rt_i2c_bus_device *bus) +{ + rt_pin_mode(PWDN_PIN, PIN_MODE_OUTPUT); + + rt_thread_mdelay(5); // 等待模块上电稳定,最少5ms,然后拉低PWDN + rt_pin_write(PWDN_PIN, PIN_LOW); // PWDN 引脚输出低电平,不开启掉电模式,摄像头正常工作,此时摄像头模块的白色LED会点亮 + + // 根据OV2640的上电时序,硬件复位的持续时间要>=3ms,反客的OV2640采用硬件RC复位,持续时间大概在6ms左右 + // 因此加入延时,等待硬件复位完成并稳定下来 + rt_thread_mdelay(5); + + write_reg(bus, OV2640_SEL_Registers, OV2640_SEL_SENSOR); // 选择 SENSOR 寄存器组 + write_reg(bus, OV2640_SENSOR_COM7, 0x80); // 启动软件复位 + + // 根据OV2640的软件复位时序,软件复位执行后,要>=2ms方可执行SCCB配置,此处采用保守一点的参数,延时10ms + rt_thread_mdelay(10); + return RT_EOK; +} + +static rt_err_t ov2640_config(struct rt_i2c_bus_device *bus, const rt_uint8_t (*configdata)[2]) +{ + rt_uint32_t i = 0; + + for (i = 0; configdata[i][0]; i++) { + write_reg(bus, configdata[i][0], configdata[i][1]); // 进行参数配置 + } + + return RT_EOK; +} + +void ov2640_set_pixformat(struct rt_i2c_bus_device *bus, rt_uint8_t pixformat) +{ + const rt_uint8_t(*configdata)[2]; + uint32_t i; // 计数变量 + + switch (pixformat) { + case Pixformat_RGB565: + configdata = OV2640_RGB565_Config; + break; + case Pixformat_JPEG: + configdata = OV2640_JPEG_Config; + break; + default: + break; + } + + for (i = 0; configdata[i][0]; i++) { + write_reg(bus, configdata[i][0], configdata[i][1]); // 进行参数配置 + } +} + +rt_err_t ov2640_set_framesize(struct rt_i2c_bus_device *bus, rt_uint16_t width, rt_uint16_t height) +{ + if ((width % 4) || (height % 4)) // 输出图像的大小一定要能被4整除 + { + return -RT_ERROR; // 返回错误标志 + } + + write_reg(bus, OV2640_SEL_Registers,OV2640_SEL_DSP); // 选择 dsp寄存器组 + + write_reg(bus, 0x5a, width / 4 & 0xff); // 实际图像输出的宽度(outw),7~0 bit,寄存器的值等于实际值/4 + write_reg(bus, 0x5b, height / 4 & 0xff); // 实际图像输出的高度(outh),7~0 bit,寄存器的值等于实际值/4 + write_reg(bus, 0x5c, (width / 4 >> 8 & 0x03) | (height / 4 >> 6 & 0x04)); // 设置zmhh的bit[2:0],也就是outh 的第 8 bit,outw 的第 9~8 bit, + + write_reg(bus, OV2640_DSP_RESET, 0x00); // 复位 + + return RT_EOK; // 成功 +} + +rt_err_t ov2640_set_horizontal_mirror(struct rt_i2c_bus_device *bus, rt_uint8_t configstate) +{ + rt_uint8_t ov2640_reg; // 寄存器的值 + + write_reg(bus, OV2640_SEL_Registers, OV2640_SEL_SENSOR); // 选择 sensor 寄存器组 + read_reg(bus, OV2640_SENSOR_REG04, 1, &ov2640_reg); // 读取 0x04 的寄存器值 + + // reg04,寄存器组4,寄存器地址为 0x04,该寄存器的bit[7],用于设置水平是否镜像 + if (configstate == OV2640_Enable) // 如果使能镜像 + { + ov2640_reg |= 0x80; // bit[7]置1则镜像 + } else // 取消镜像 + { + ov2640_reg &= ~0x80; // bit[7]置0则是正常模式 + } + return write_reg(bus, OV2640_SENSOR_REG04, ov2640_reg); // 写入寄存器 +} + +rt_err_t ov2640_set_vertical_flip(struct rt_i2c_bus_device *bus, rt_uint8_t configstate) +{ + rt_uint8_t ov2640_reg; // 寄存器的值 + + write_reg(bus, OV2640_SEL_Registers, OV2640_SEL_SENSOR); // 选择 sensor 寄存器组 + read_reg(bus, OV2640_SENSOR_REG04, 1, &ov2640_reg); // 读取 0x04 的寄存器值 + + // reg04,寄存器组4,寄存器地址为 0x04,该寄存器的第bit[6],用于设置水平是垂直翻转 + if (configstate == OV2640_Enable) { + // 此处设置参考openmv的驱动 + // bit[4]具体的作用是什么手册没有说,如果垂直翻转之后,该位不置1的话,颜色会不对 + ov2640_reg |= 0x40 | 0x10; // bit[6]置1时,图像会垂直翻转 + } else // 取消翻转 + { + ov2640_reg &= ~(0x40 | 0x10); // 将bit[6]和bit[4]都写0 + } + return write_reg(bus, OV2640_SENSOR_REG04, ov2640_reg); // 写入寄存器 +} + +void ov2640_set_saturation(struct rt_i2c_bus_device *bus, rt_int8_t saturation) +{ + write_reg(bus, OV2640_SEL_Registers, OV2640_SEL_DSP); // 选择 dsp寄存器组 + + switch (saturation) { + case 2: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x02); + write_reg(bus, OV2640_DSP_BPADDR, 0x03); + write_reg(bus, OV2640_DSP_BPDATA, 0x68); + write_reg(bus, OV2640_DSP_BPDATA, 0x68); + break; + + case 1: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x02); + write_reg(bus, OV2640_DSP_BPADDR, 0x03); + write_reg(bus, OV2640_DSP_BPDATA, 0x58); + write_reg(bus, OV2640_DSP_BPDATA, 0x58); + break; + + case 0: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x02); + write_reg(bus, OV2640_DSP_BPADDR, 0x03); + write_reg(bus, OV2640_DSP_BPDATA, 0x48); + write_reg(bus, OV2640_DSP_BPDATA, 0x48); + break; + + case -1: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x02); + write_reg(bus, OV2640_DSP_BPADDR, 0x03); + write_reg(bus, OV2640_DSP_BPDATA, 0x38); + write_reg(bus, OV2640_DSP_BPDATA, 0x38); + break; + + case -2: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x02); + write_reg(bus, OV2640_DSP_BPADDR, 0x03); + write_reg(bus, OV2640_DSP_BPDATA, 0x28); + write_reg(bus, OV2640_DSP_BPDATA, 0x28); + break; + + default: + break; + } +} + +void ov2640_set_brightness(struct rt_i2c_bus_device *bus, rt_int8_t brightness) +{ + write_reg(bus, OV2640_SEL_Registers, OV2640_SEL_DSP); // 选择 dsp寄存器组 + + switch (brightness) { + case 2: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x04); + write_reg(bus, OV2640_DSP_BPADDR, 0x09); + write_reg(bus, OV2640_DSP_BPDATA, 0x40); + write_reg(bus, OV2640_DSP_BPDATA, 0x00); + break; + + case 1: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x04); + write_reg(bus, OV2640_DSP_BPADDR, 0x09); + write_reg(bus, OV2640_DSP_BPDATA, 0x30); + write_reg(bus, OV2640_DSP_BPDATA, 0x00); + break; + + case 0: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x04); + write_reg(bus, OV2640_DSP_BPADDR, 0x09); + write_reg(bus, OV2640_DSP_BPDATA, 0x20); + write_reg(bus, OV2640_DSP_BPDATA, 0x00); + break; + + case -1: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x04); + write_reg(bus, OV2640_DSP_BPADDR, 0x09); + write_reg(bus, OV2640_DSP_BPDATA, 0x10); + write_reg(bus, OV2640_DSP_BPDATA, 0x00); + break; + + case -2: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x04); + write_reg(bus, OV2640_DSP_BPADDR, 0x09); + write_reg(bus, OV2640_DSP_BPDATA, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x00); + break; + + default: + break; + } +} + +void ov2640_set_contrast(struct rt_i2c_bus_device *bus, rt_int8_t contrast) +{ + write_reg(bus, OV2640_SEL_Registers, OV2640_SEL_DSP); // 选择 dsp寄存器组 + + switch (contrast) { + case 2: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x04); + write_reg(bus, OV2640_DSP_BPADDR, 0x07); + write_reg(bus, OV2640_DSP_BPDATA, 0x20); + write_reg(bus, OV2640_DSP_BPADDR, 0x28); + write_reg(bus, OV2640_DSP_BPDATA, 0x0c); + write_reg(bus, OV2640_DSP_BPDATA, 0x06); + break; + + case 1: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x04); + write_reg(bus, OV2640_DSP_BPADDR, 0x07); + write_reg(bus, OV2640_DSP_BPDATA, 0x20); + write_reg(bus, OV2640_DSP_BPADDR, 0x24); + write_reg(bus, OV2640_DSP_BPDATA, 0x16); + write_reg(bus, OV2640_DSP_BPDATA, 0x06); + break; + + case 0: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x04); + write_reg(bus, OV2640_DSP_BPADDR, 0x07); + write_reg(bus, OV2640_DSP_BPDATA, 0x20); + write_reg(bus, OV2640_DSP_BPADDR, 0x20); + write_reg(bus, OV2640_DSP_BPDATA, 0x20); + write_reg(bus, OV2640_DSP_BPDATA, 0x06); + break; + + case -1: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x04); + write_reg(bus, OV2640_DSP_BPADDR, 0x07); + write_reg(bus, OV2640_DSP_BPDATA, 0x20); + write_reg(bus, OV2640_DSP_BPADDR, 0x1c); + write_reg(bus, OV2640_DSP_BPDATA, 0x2a); + write_reg(bus, OV2640_DSP_BPDATA, 0x06); + break; + + case -2: + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x04); + write_reg(bus, OV2640_DSP_BPADDR, 0x07); + write_reg(bus, OV2640_DSP_BPDATA, 0x20); + write_reg(bus, OV2640_DSP_BPADDR, 0x18); + write_reg(bus, OV2640_DSP_BPDATA, 0x34); + write_reg(bus, OV2640_DSP_BPDATA, 0x06); + break; + + default: + break; + } +} + +void ov2640_set_effect(struct rt_i2c_bus_device *bus, rt_uint8_t effect_mode) +{ + write_reg(bus, OV2640_SEL_Registers, OV2640_SEL_DSP); // 选择 dsp寄存器组 + + switch (effect_mode) { + case OV2640_Effect_Normal: // 正常模式 + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x00); + write_reg(bus, OV2640_DSP_BPADDR, 0x05); + write_reg(bus, OV2640_DSP_BPDATA, 0x80); + write_reg(bus, OV2640_DSP_BPDATA, 0x80); + break; + + case OV2640_Effect_Negative: // 负片模式,也就是颜色全部取反 + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x40); + write_reg(bus, OV2640_DSP_BPADDR, 0x05); + write_reg(bus, OV2640_DSP_BPDATA, 0x80); + write_reg(bus, OV2640_DSP_BPDATA, 0x80); + break; + + case OV2640_Effect_BW: // 黑白模式 + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x18); + write_reg(bus, OV2640_DSP_BPADDR, 0x05); + write_reg(bus, OV2640_DSP_BPDATA, 0x80); + write_reg(bus, OV2640_DSP_BPDATA, 0x80); + break; + + case OV2640_Effect_BW_Negative: // 黑白+负片模式 + write_reg(bus, OV2640_DSP_BPADDR, 0x00); + write_reg(bus, OV2640_DSP_BPDATA, 0x58); + write_reg(bus, OV2640_DSP_BPADDR, 0x05); + write_reg(bus, OV2640_DSP_BPDATA, 0x80); + write_reg(bus, OV2640_DSP_BPDATA, 0x80); + break; + + default: + break; + } +} + +int rt_hw_ov2640_init(void) +{ + extern rt_err_t ov2640_dcmi_crop(uint16_t displey_xsize, uint16_t displey_ysize, uint16_t sensor_xsize, uint16_t sensor_ysize); + + static rt_uint16_t id = 0; + rt_device_t dcmi_dev = RT_NULL; + + i2c_bus = rt_i2c_bus_device_find(I2C_NAME); + if (i2c_bus == RT_NULL) + { + LOG_E("can't find %c deivce", I2C_NAME); + return -RT_ERROR; + } + + /* dcmi init */ + dcmi_dev = rt_device_find("dcmi"); + if (dcmi_dev == RT_NULL) + { + LOG_E("can't find dcmi device!"); + return -RT_ERROR; + } + rt_device_open(dcmi_dev, RT_DEVICE_FLAG_RDWR); + + ov2640_reset(i2c_bus); + ov2640_read_id(i2c_bus, &id); + ov2640_config(i2c_bus, OV2640_SVGA_Config); // 配置 SVGA模式 ------> 800*600, 最大帧率30帧 + // ov2640_config(i2c_bus, OV2640_UXGA_Config); // 配置 UXGA模式 ------> 1600*1200,最大帧率15帧 + ov2640_set_framesize(i2c_bus, OV2640_Width, OV2640_Height); // 设置OV2640输出的图像大小 + + // 将OV2640输出图像裁剪成适应屏幕的大小 + struct stm32_dcmi_cropsize cropsize = {Display_Width, Display_Height, OV2640_Width, OV2640_Height}; + rt_device_control(dcmi_dev, DCMI_CTRL_CROP, &cropsize); + + ov2640_set_pixformat(i2c_bus, Pixformat_RGB565); + // ov2640_set_pixformat(i2c_bus, Pixformat_JPEG); + + ov2640_set_saturation(i2c_bus, 0); + ov2640_set_brightness(i2c_bus, 0); + ov2640_set_contrast(i2c_bus, 0); + ov2640_set_effect(i2c_bus, OV2640_Effect_Normal); + + return RT_EOK; +} +INIT_APP_EXPORT(rt_hw_ov2640_init); + +#ifdef DRV_DEBUG +#ifdef FINSH_USING_MSH +#ifdef BSP_USING_LCD_SPI +#include "drv_lcd_spi.h" +int camera_sample(int argc, char **argv) +{ + rt_device_t dcmi_dev = RT_NULL; + rt_uint8_t fps = 0; + dcmi_dev = rt_device_find("dcmi"); + if (dcmi_dev == RT_NULL) + { + LOG_E("can't find dcmi device!"); + return -RT_ERROR; + } + struct stm32_dcmi* stm32_dcmi_dev = DCMI_DEVICE(dcmi_dev); + + // malloc dma memory + struct rt_memheap* axi_sram = (struct rt_memheap*)rt_object_find("axi_sram", RT_Object_Class_MemHeap); + void* buff_ptr = rt_memheap_alloc(axi_sram, OV2640_BufferSize); + + // 启动DMA连续传输 + struct stm32_dcmi_dma_transmitbuffer transmitbuffer = {(uint32_t)buff_ptr, OV2640_BufferSize}; + rt_device_control(dcmi_dev, DCMI_CTRL_TRANSMIT_CONTINUOUS, &transmitbuffer); + + while (1) { + rt_sem_take(&stm32_dcmi_dev->cam_semaphore, RT_WAITING_FOREVER); + // rt_device_control(dcmi_dev, DCMI_CTRL_SUSPEND, RT_NULL); + + // 将图像数据复制到屏幕 + lcd_copybuffer(0, 0, Display_Width, Display_Height, (uint16_t *)buff_ptr); + // rt_device_control(dcmi_dev, DCMI_CTRL_RESUME, RT_NULL); + rt_device_control(dcmi_dev, DCMI_CTRL_GET_FPS, &fps); + LOG_D("fps: %d", fps); + } + rt_memheap_free(buff_ptr); +} +MSH_CMD_EXPORT(camera_sample, record picture to lcd); + +#endif /* BSP_USING_LCD_SPI */ +#endif /* FINSH_USING_MSH */ +#endif /* DRV_DEBUG */ + +#endif diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640.h b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640.h new file mode 100644 index 0000000000..69e5e7d0dc --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640.h @@ -0,0 +1,94 @@ + +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-24 spaceman the first version + */ + +#ifndef __DRV_OV2640_H__ +#define __DRV_OV2640_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief OV2640 ID + */ +#define OV2640_ID1 0x2640U +#define OV2640_ID2 0x2642U + +#define OV2640_Enable 1 +#define OV2640_Disable 0 + +// 用于设置输出的格式,被 ov2640_set_pixformat() 引用 +#define Pixformat_RGB565 0 +#define Pixformat_JPEG 1 + +// OV2640的特效模式,被 ov2640_set_effect() 引用 +#define OV2640_Effect_Normal 0 // 正常模式 +#define OV2640_Effect_Negative 1 // 负片模式,也就是颜色全部取反 +#define OV2640_Effect_BW 2 // 黑白模式 +#define OV2640_Effect_BW_Negative 3 // 黑白模式+负片模式 + +// 1. 定义OV2640实际输出的图像大小,可以根据实际的应用或者显示屏进行调整(同时也要修改配置参数里的时钟分频) +// 2. 这两个参数不会影响帧率,且不能超过对应模式的最大尺寸 +// 3. SVGA模式下,输出图像最大分辨率为 800*600, 最大帧率30帧 +// 4. UXGA模式下,输出图像最大分辨率为 1600*1200,最大帧率15帧 +// 5. 要设置的图像长、宽必须能被4整除! +// 6. 要设置的图像长、宽比必须满足4:3,不然画面会被拉伸畸变 +#define OV2640_Width 400 // 图像长度 +#define OV2640_Height 300 // 图像宽度 + +// 1. 定义要显示的画面大小,数值一定要能被4整除!! +// 2. RGB565格式下,最终会由DCMI将OV2640输出的4:3图像裁剪为适应屏幕的比例 +// 3. 此处的分辨率不能超过 OV2640_Width 和 OV2640_Height +// 4. 分辨率太高时,需要修改PCLK的时钟速度,详细计算说明可参考 dcmi_ov2640_cfg.h 里的 0xd3 寄存器配置 +#define Display_Width LCD_WIDTH +#define Display_Height LCD_HEIGHT + +// 1.RGB565模式下,需要 图像分辨率*2 的大小 +// 2.JPG模式下,需要的缓冲区大小并不是固定的,例如 640*480分辨率,JPG图像大概要占30K, +// 缓冲区预留2倍左右大小即可,用户可根据实际情况去设置, +#define OV2640_BufferSize Display_Width *Display_Height * 2 / 4 // DMA传输数据大小(32位宽) +// #define OV2640_BufferSize 100*1024/4 // DMA传输数据大小(32位宽) + +#define OV2640_SEL_Registers 0xFF // 寄存器组选择寄存器 +#define OV2640_SEL_DSP 0x00 // 设置为0x00时,选择 DSP 寄存器组 +#define OV2640_SEL_SENSOR 0x01 // 设置为0x01时,选择 SENSOR 寄存器组 + +// DSP 寄存器组 (0xFF = 0x00) +#define OV2640_DSP_RESET 0xE0 // 可选择复位 控制器、SCCB单元、JPEG单元、DVP接口单元等 +#define OV2640_DSP_BPADDR 0x7C // 间接寄存器访问:地址 +#define OV2640_DSP_BPDATA 0x7D // 间接寄存器访问:数据 + +// SENSOR 寄存器组 (0xFF = 0x01) +#define OV2640_SENSOR_COM7 0x12 // 公共控制,系统复位、摄像头分辨率选择、缩放模式、颜色彩条设置 +#define OV2640_SENSOR_REG04 0x04 // 寄存器组4,可设置摄像头扫描方向等 +#define OV2640_SENSOR_PIDH 0x0a // ID高字节 +#define OV2640_SENSOR_PIDL 0x0b // ID低字节 + +void ov2640_set_pixformat(struct rt_i2c_bus_device *bus, rt_uint8_t pixformat); + +rt_err_t ov2640_set_framesize(struct rt_i2c_bus_device *bus, rt_uint16_t width, rt_uint16_t height); + +rt_err_t ov2640_set_horizontal_mirror(struct rt_i2c_bus_device *bus, rt_uint8_t configstate); +rt_err_t ov2640_set_vertical_flip(struct rt_i2c_bus_device *bus, rt_uint8_t configstate); + +void ov2640_set_saturation(struct rt_i2c_bus_device *bus, rt_int8_t saturation); +void ov2640_set_brightness(struct rt_i2c_bus_device *bus, rt_int8_t brightness); +void ov2640_set_contrast(struct rt_i2c_bus_device *bus, rt_int8_t contrast); +void ov2640_set_effect(struct rt_i2c_bus_device *bus, rt_uint8_t effect_mode); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640_cfg.h b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640_cfg.h new file mode 100644 index 0000000000..5112b6eb65 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/camera/drv_ov2640_cfg.h @@ -0,0 +1,495 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-24 spaceman the first version + */ + +#ifndef __DRV_OV2640_CFG_H +#define __DRV_OV2640_CFG_H + +#include + +// RGB565格式配置 +const rt_uint8_t OV2640_RGB565_Config[][2] = + { + {0xff, 0x00}, // 设置DSP寄存器租 + {0xda, 0x09}, // 数据接口模式 + {0xd7, 0x03}, // 手册里没有说明该寄存器的功能,此处参考OpenMV的设置 + {0xE0, 0x00}, // RESET,可选择复位 控制器、SCCB单元、JPEG单元、DVP接口单元等 + {0x05, 0x00}, // 使能DSP + {0, 0}, // 结束 +}; + +// JPEG格式配置 +const rt_uint8_t OV2640_JPEG_Config[][2] = + { + {0xff, 0x00}, // 设置DSP寄存器租 + {0xda, 0x10}, // 数据接口模式 + {0xe1, 0x77}, // 手册里没有说明该寄存器的功能,此处参考OpenMV的设置,JPG模式一定要设置为0x77!! + {0xd7, 0x03}, // 手册里没有说明该寄存器的功能,此处参考OpenMV的设置 + {0xe0, 0x00}, // RESET,可选择复位 控制器、SCCB单元、JPEG单元、DVP接口单元等 + {0x05, 0x00}, // 使能DSP + {0, 0}, // 结束 +}; + +/* SVGA 分辨率为800*600,最高支持30帧 */ +const rt_uint8_t OV2640_SVGA_Config[][2] = + { + {0xff, 0x01}, // 设置 sensor 寄存器组 + {0x12, 0x80}, // 复位全部寄存 + + {0xff, 0x00}, // 设置DSP寄存器租 + {0x2c, 0xff}, // 手册里没有说明该寄存器的功能,但是给出的参考代码又配置了该寄存器,因此保留 + {0x2e, 0xdf}, + + {0xff, 0x01}, // 设置 sensor 寄存器组 + + // 手册里没有说明这些寄存器的作用,这里直接保留官方给的设置参数 + {0x3c, 0x32}, + {0x2c, 0x0c}, + {0x33, 0x78}, + {0x3a, 0x33}, + {0x3b, 0xfB}, + {0x3e, 0x00}, + {0x43, 0x11}, + {0x16, 0x10}, + {0x39, 0x92}, + {0x35, 0xda}, + {0x22, 0x1a}, + {0x37, 0xc3}, + {0x36, 0x1a}, + {0x4c, 0x00}, + {0x5B, 0x00}, + {0x42, 0x03}, + {0x4a, 0x81}, + {0x21, 0x99}, + {0x5c, 0x00}, + {0x63, 0x00}, + {0x7c, 0x05}, + {0x6c, 0x00}, + {0x6d, 0x80}, + {0x6e, 0x00}, + {0x70, 0x02}, + {0x71, 0x94}, + {0x73, 0xc1}, + {0x20, 0x80}, + {0x28, 0x30}, + {0x37, 0xc0}, + {0x3d, 0x38}, + {0x6d, 0x00}, + {0x23, 0x00}, + {0x06, 0x88}, + {0x07, 0xc0}, + {0x0d, 0x87}, + {0x0e, 0x41}, + + // 该寄存器用于控制OV2640的系统时钟是否倍频或者分频 + // Bit[7]: 设置为1时,开启PLL倍频,系统时钟 = 2倍的 XVCLK + // Bit[5:0]:分频系数, 系统时钟 = XVCLK / (Bit[5:0] + 1) + // 我们的模块使用的 XVCLK 是24M,是OV2640默认的时钟,因此不用调整,系统时钟 = XVCLK =24M + {0x11, 0x00}, // CLKRC,时钟分频控制 + + {0x09, 0x02}, // COM2,公共控制,输出驱动能力选择 + {0x04, 0x28}, // REG04,寄存器组4,可设置摄像头扫描方向等 + {0x12, 0x40}, // COM7,公共控制,系统复位、摄像头分辨率选择、缩放模式、颜色彩条设置 + {0x14, 0x48}, // COM9,公共控制,增益设置 + {0x15, 0x00}, // COM10,公共控制,PCLK、HS、VS输出极性控制 + {0x32, 0x09}, // REG32,寄存器组32,像素时钟分频以及水平起始、终止像素的(低3位) + {0x03, 0x8a}, // COM1,公共控制,无效帧设置、垂直窗口起始、结束行(低2位) + {0x46, 0x00}, // FLL,帧率长度调整,通过插入空行来降低帧率,也可以通过 0x2a/0x2b/0x47等寄存器去调整 + {0x24, 0x40}, // AEW,环境平均亮度大于AEW(7:0)时,AEC/AGC值将降低 + {0x25, 0x38}, // AEB,环境平均亮度小于AEB(7:0)时,AEC/AGC值将增加 + {0x26, 0x82}, // VV,快速模式步进阈值 + {0x34, 0xc0}, // ARCOM2,缩放窗口水平起始像素 + {0x61, 0x70}, // HISTO_LOW ,低等级直方图算法 + {0x62, 0x80}, // HISTO_HIGH,高等级直方图算法 + + {0x17, 0x11}, // HREFST,水平窗口起始像素(高8位),默认值0x11 + {0x18, 0x43}, // HREFEND,水平窗口终止像素(高8位),UXGA默认值 0x75, SVGA和CIF默认值0x43 + // VSTRT,垂直窗口起始行(高8位),数据手册建议的配置是:UXGA为 0x01, SVGA和CIF模式为 0x00 + // 在OpenMV的配置中,不管什么模式都建议配置成 0x01,代码的解释是解决垃圾像素的问题。 + // 在笔者实际的测试中,如果配置成0x00,发现在图像垂直翻转的时候会有一行显示不对,应该就是openMV所说的垃圾像素 + // 因此这里也直接配置成 0x01,问题解决 + {0x19, 0x01}, // VSTRT,垂直窗口起始行(高8位) + {0x1a, 0x97}, // VEND, 垂直窗口结束行(高8位),默认值 0x97 + + // 以下5个寄存器,共同决定了光带滤除的效果(室内照明灯具开关频率是50HZ,对于传感器而言,会捕捉到明暗交错的光带) + // 用户可以结合手册,根据实际场景去配置,以达到最佳的光带滤除效果 + {0x13, 0xe5}, // COM8,公共控制,曝光、自动增益、滤波设置 + {0x0c, 0x3a}, // COM3,公共控制,自动或手动设置带宽、快照和视频输出配置 + {0x4f, 0xbb}, // BD50,50Hz带宽 AEC低8位 + {0x50, 0x9c}, // BD60,60HZ带宽 AEC低8位 + {0x5a, 0x23}, // 手册没有说明该寄存器的作用,参考手册进行配置 + + {0xff, 0x00}, // 设置DSP寄存器租 + + // 手册里没有说明这些寄存器的作用,这里直接保留官方给的设置参数 FanKe + {0xe5, 0x7f}, + {0x41, 0x24}, + {0x76, 0xff}, + {0x33, 0xa0}, + {0x42, 0x20}, + {0x43, 0x18}, + {0x4c, 0x00}, + {0xd7, 0x03}, + {0xd9, 0x10}, + {0x88, 0x3f}, + {0xc8, 0x08}, + {0xc9, 0x80}, + {0x7c, 0x00}, + {0x7d, 0x00}, + {0x7c, 0x03}, + {0x7d, 0x48}, + {0x7d, 0x48}, + {0x7c, 0x08}, + {0x7d, 0x20}, + {0x7d, 0x10}, + {0x7d, 0x0e}, + {0x90, 0x00}, + {0x91, 0x0e}, + {0x91, 0x1a}, + {0x91, 0x31}, + {0x91, 0x5a}, + {0x91, 0x69}, + {0x91, 0x75}, + {0x91, 0x7e}, + {0x91, 0x88}, + {0x91, 0x8f}, + {0x91, 0x96}, + {0x91, 0xa3}, + {0x91, 0xaf}, + {0x91, 0xc4}, + {0x91, 0xd7}, + {0x91, 0xe8}, + {0x91, 0x20}, + {0x92, 0x00}, + {0x93, 0x06}, + {0x93, 0xe3}, + {0x93, 0x05}, + {0x93, 0x05}, + {0x93, 0x00}, + {0x93, 0x04}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x96, 0x00}, + {0x97, 0x08}, + {0x97, 0x19}, + {0x97, 0x02}, + {0x97, 0x0c}, + {0x97, 0x24}, + {0x97, 0x30}, + {0x97, 0x28}, + {0x97, 0x26}, + {0x97, 0x02}, + {0x97, 0x98}, + {0x97, 0x80}, + {0x97, 0x00}, + {0x97, 0x00}, + {0xa4, 0x00}, + {0xa8, 0x00}, + {0xc5, 0x11}, + {0xc6, 0x51}, + {0xbf, 0x80}, + {0xc7, 0x10}, + {0xb6, 0x66}, + {0xb8, 0xA5}, + {0xb7, 0x64}, + {0xb9, 0x7C}, + {0xb3, 0xaf}, + {0xb4, 0x97}, + {0xb5, 0xFF}, + {0xb0, 0xC5}, + {0xb1, 0x94}, + {0xb2, 0x0f}, + {0xc4, 0x5c}, + {0x7f, 0x00}, + + {0xf9, 0xc0}, // MC_BIST,控制器复位、ROM选择 + {0xe0, 0x14}, // RESET,可选择复位 控制器、SCCB单元、JPEG单元、DVP接口单元等 + {0x87, 0xd0}, // CTRL3,使能芯片内部的指定的模块 + {0xc3, 0xed}, // CTRL1,使能芯片内部的指定的模块 + {0xc2, 0x0e}, // CTRL0,使能YUV422、YUV_EN、RGB_EN + {0x86, 0x3d}, // CTRL2,使能芯片内部的指定的模块 + {0xda, 0x09}, // 图像输出模式,可设置JPEG输出、RGB565等,可设置是否翻转DVP接口的输出 + + // 此处设置的是传感器的图像尺寸,与配置的模式有关,例如SVGA需要设置成800*480,XVGA要设置成1600*1200 + {0xc0, 0x64}, // 图像的水平尺寸,10~3 bit + {0xc1, 0x4b}, // 图像的垂直尺寸,10~3 bit + {0x8c, 0x00}, // 图像水平尺寸的第 11 bit以及2~0bit,图像垂直尺寸的 2~0bit + + {0x50, 0x00}, // CTRLI,设置 水平和垂直分频器 + {0x51, 0xc8}, // 水平尺寸,7~0 bit,必须要能被4整除 + {0x52, 0x96}, // 垂直尺寸,7~0 bit,必须要能被4整除 + {0x53, 0x00}, // 水平偏移,7~0 bit, + {0x54, 0x00}, // 垂直偏移,7~0 bit, + {0x55, 0x00}, // 水平、垂直尺寸的第 8 bit, 水平、垂直偏移的 第 10~8 bit + {0x57, 0x00}, // 水平尺寸的第 9 bit + + // 0xd3 寄存器用于设置像素驱动时钟,即 PCLK 的输出频率,有自动模式和手动模式 + // 在自动模式下,PCLK的频率会非常高,适用于高分辨率或者有高速缓存的场合,用户可根据实际工况选择最合适的模式 + // + // Bit[7]: 设置为1时,开启自动模式,此时 PCLK 由OV2640自动控制,该模式下的PCLK频率非常高, + // 适用于高分辨率或者有高速缓存的场合 + // + // Bit[6:0]:手动设置分频系数,当设置成YUV模式或RGB565模式时, PCLK = sysclk / Bit[6:0] , + // 当 时钟控制寄存器 0x11(CLKRC)设置为 不分频 且外部输入时钟为24M时, + // 在SVGA模式下, PCLK = 2*24M / Bit[6:0] + // fanke + // 如果要手动配置,用户需要根据实际输出的图像尺寸去计算具体的 PCLK ,这里以 480*360 分辨率为例: + // 一帧 RGB565(16位色) 图像的数据量为:480*360*2 = 345.6 KB , + // OV2640在 SVGA模式下,帧率为30左右,则每秒的数据量在 345.6 * 30 = 10.4 MB 左右, + // 因为模块是8位的接口,则PCLK最少要设置为 10.4 MHz,才能满足图像传输的需求,不然会导致花屏 , + // 加上OV2640的帧率是可以微调的,因此实际的 PCLK 要稍微大些,此处设置为 12M, + // 即 PCLK = 48M / Bit[6:0] = 48 / 0x04 = 12M + {0xd3, 0x04}, // R_DVP_SP, 设置 PCLK 引脚的时钟 + + // 手册里没有说明这些寄存器的作用,这里直接保留官方给的设置参数 + {0xe5, 0x1f}, + {0xe1, 0x67}, + {0xdd, 0x7f}, + + {0xe0, 0x00}, // RESET,可选择复位 控制器、SCCB单元、JPEG单元、DVP接口单元等 + {0x05, 0x00}, // 使能DSP + + // 以下为OpenMV增加的设置,0x0f寄存器在数据手册里没有说明,但是在编程手册4.2小节有提到, + // 按照编程手册给的代码, 0x0f这个寄存器是自动控制帧率用的,但是手册里只有在夜晚模式时才进行配置 + // {0xff, 0x01}, // 设置 sensor 寄存器组 + // {0x0f, 0x4b}, + // fanke + + {0, 0}, // 结束 +}; + +/* UXGA 分辨率为1600*1200,最高支持15帧 */ +const rt_uint8_t OV2640_UXGA_Config[][2] = + { + {0xff, 0x01}, // 设置 sensor 寄存器组 + {0x12, 0x80}, // 复位全部寄存 + + {0xff, 0x00}, // 设置DSP寄存器租 + {0x2c, 0xff}, // 手册里没有说明该寄存器的功能,但是给出的参考代码又配置了该寄存器,因此保留 + {0x2e, 0xdf}, + + {0xff, 0x01}, // 设置 sensor 寄存器组 + + // 手册里没有说明这些寄存器的作用,这里直接保留官方给的设置参数 + {0x3c, 0x32}, + {0x2c, 0x0c}, + {0x33, 0x78}, + {0x3a, 0x33}, + {0x3b, 0xfB}, + {0x3e, 0x00}, + {0x43, 0x11}, + {0x39, 0x82}, + {0x35, 0x88}, + {0x22, 0x0a}, + {0x37, 0x40}, + {0x23, 0x00}, + {0x36, 0x1a}, + {0x06, 0x02}, + {0x07, 0xc0}, + {0x0d, 0xb7}, + {0x0e, 0x01}, + {0x42, 0x83}, + {0x4c, 0x00}, + {0x5B, 0x00}, + {0x4a, 0x81}, + {0x21, 0x99}, + {0x5c, 0x00}, + {0x63, 0x00}, + {0x7c, 0x05}, + {0x20, 0x80}, + {0x28, 0x30}, + {0x6c, 0x00}, + {0x6d, 0x80}, + {0x6e, 0x00}, + {0x70, 0x02}, + {0x71, 0x94}, + {0x73, 0xc1}, + {0x3d, 0x34}, + {0x16, 0x10}, + + // 该寄存器用于控制OV2640的系统时钟是否倍频或者分频 + // Bit[7]: 设置为1时,开启PLL倍频,系统时钟 = 2倍的 XVCLK + // Bit[5:0]:分频系数, 系统时钟 = XVCLK / (Bit[5:0] + 1) + // 我们的模块使用的 XVCLK 是24M,是OV2640默认的时钟,因此不用调整,系统时钟 = XVCLK =24M + {0x11, 0x00}, // CLKRC,时钟分频控制 + + {0x09, 0x02}, // COM2,公共控制,输出驱动能力选择 + {0x04, 0x28}, // REG04,寄存器组4,可设置摄像头扫描方向等 + {0x12, 0x00}, // COM7,公共控制,系统复位、摄像头分辨率选择、缩放模式、颜色彩条设置 + {0x14, 0x48}, // COM9,公共控制,增益设置 + {0x15, 0x00}, // COM10,公共控制,PCLK、HS、VS输出极性控制 + {0x32, 0x36}, // REG32,寄存器组32,像素时钟分频以及水平起始、终止像素的(低3位) + {0x03, 0x8F}, // COM1,公共控制,无效帧设置、垂直窗口起始、结束行(低2位) + {0x46, 0x00}, // FLL,帧率长度调整,通过插入空行来降低帧率,也可以通过 0x2a/0x2b/0x47等寄存器去调整 + {0x24, 0x40}, // AEW,环境平均亮度大于AEW(7:0)时,AEC/AGC值将降低 + {0x25, 0x38}, // AEB,环境平均亮度小于AEB(7:0)时,AEC/AGC值将增加 + {0x26, 0x82}, // VV,快速模式步进阈值 + {0x34, 0xa0}, // ARCOM2,缩放窗口水平起始像素 + {0x61, 0x70}, // HISTO_LOW ,低等级直方图算法 + {0x62, 0x80}, // HISTO_HIGH,高等级直方图算法 + + {0x17, 0x11}, // HREFST,水平窗口起始像素(高8位),默认值0x11 + {0x18, 0x75}, // HREFEND,水平窗口终止像素(高8位),UXGA默认值 0x75, SVGA和CIF默认值0x43 + // VSTRT,垂直窗口起始行(高8位),数据手册建议的配置是:UXGA为 0x01, SVGA和CIF模式为 0x00 + {0x19, 0x01}, // VSTRT,垂直窗口起始行(高8位) + {0x1a, 0x97}, // VEND, 垂直窗口结束行(高8位),默认值 0x97 + + // 以下5个寄存器,共同决定了光带滤除的效果(室内照明灯具开关频率是50HZ,对于传感器而言,会捕捉到明暗交错的光带) + // 用户可以结合手册,根据实际场景去配置,以达到最佳的光带滤除效果 + {0x13, 0xe5}, // COM8,公共控制,曝光、自动增益、滤波设置 + {0x0c, 0x3c}, // COM3,公共控制,自动或手动设置带宽、快照和视频输出配置 + {0x4f, 0xa8}, // BD50,50Hz带宽 AEC低8位 + {0x50, 0x8C}, // BD60,60HZ带宽 AEC低8位 + {0x5a, 0x78}, // 手册没有说明该寄存器的作用,参考手册进行配置 + + {0xff, 0x00}, // 设置DSP寄存器租 + + // 手册里没有说明这些寄存器的作用,这里直接保留官方给的设置参数 Fanke + {0xe5, 0x7f}, + {0x41, 0x24}, + {0x76, 0xff}, + {0x33, 0xa0}, + {0x42, 0x20}, + {0x43, 0x18}, + {0x4c, 0x00}, + {0xc8, 0x08}, + {0xc9, 0x80}, + {0x7c, 0x00}, + {0x7d, 0x00}, + {0x7c, 0x03}, + {0x7d, 0x48}, + {0x7d, 0x48}, + {0x7c, 0x08}, + {0x7d, 0x20}, + {0x7d, 0x10}, + {0x7d, 0x0e}, + {0x90, 0x00}, + {0x91, 0x0e}, + {0x91, 0x1a}, + {0x91, 0x31}, + {0x91, 0x5a}, + {0x91, 0x69}, + {0x91, 0x75}, + {0x91, 0x7e}, + {0x91, 0x88}, + {0x91, 0x8f}, + {0x91, 0x96}, + {0x91, 0xa3}, + {0x91, 0xaf}, + {0x91, 0xc4}, + {0x91, 0xd7}, + {0x91, 0xe8}, + {0x91, 0x20}, + {0x92, 0x00}, + {0x93, 0x06}, + {0x93, 0xe3}, + {0x93, 0x05}, + {0x93, 0x05}, + {0x93, 0x00}, + {0x93, 0x04}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x93, 0x00}, + {0x96, 0x00}, + {0x97, 0x08}, + {0x97, 0x19}, + {0x97, 0x02}, + {0x97, 0x0c}, + {0x97, 0x24}, + {0x97, 0x30}, + {0x97, 0x28}, + {0x97, 0x26}, + {0x97, 0x02}, + {0x97, 0x98}, + {0x97, 0x80}, + {0x97, 0x00}, + {0x97, 0x00}, + {0x88, 0x3f}, + {0xc4, 0x9a}, + {0xa4, 0x00}, + {0xa8, 0x00}, + {0xc5, 0x11}, + {0xc6, 0x51}, + {0xbf, 0x80}, + {0xc7, 0x10}, + {0xb6, 0x66}, + {0xb8, 0xA5}, + {0xb7, 0x64}, + {0xb9, 0x7C}, + {0xb3, 0xaf}, + {0xb4, 0x97}, + {0xb5, 0xFF}, + {0xb0, 0xC5}, + {0xb1, 0x94}, + {0xb2, 0x0f}, + {0xc4, 0x5c}, + {0x7f, 0x00}, + {0xd7, 0x03}, + {0xd9, 0x10}, + + {0xf9, 0xc0}, // MC_BIST,控制器复位、ROM选择 + {0xe0, 0x14}, // RESET,可选择复位 控制器、SCCB单元、JPEG单元、DVP接口单元等 + {0x87, 0xd0}, // CTRL3,使能芯片内部的指定的模块 + {0xc3, 0xed}, // CTRL1,使能芯片内部的指定的模块 + {0xc2, 0x0e}, // CTRL0,使能YUV422、YUV_EN、RGB_EN + {0x86, 0x3d}, // CTRL2,使能芯片内部的指定的模块 + {0xda, 0x09}, // 图像输出模式,可设置JPEG输出、RGB565等,可设置是否翻转DVP接口的输出 + + // 此处设置的是传感器的图像尺寸,与配置的模式有关,例如SVGA需要设置成800*480,XVGA要设置成1600*1200 + {0xc0, 0xc8}, // 图像的水平尺寸,10~3 bit + {0xc1, 0x96}, // 图像的垂直尺寸,10~3 bit + {0x8c, 0x00}, // 图像水平尺寸的第 11 bit以及2~0bit,图像垂直尺寸的 2~0bit + + {0x50, 0x00}, // CTRLI,设置 水平和垂直分频器 + {0x51, 0x90}, // 水平尺寸,7~0 bit,必须要能被4整除 + {0x52, 0x2c}, // 垂直尺寸,7~0 bit,必须要能被4整除 + {0x53, 0x00}, // 水平偏移,7~0 bit, + {0x54, 0x00}, // 垂直偏移,7~0 bit, + {0x55, 0x88}, // 水平、垂直尺寸的第 8 bit, 水平、垂直偏移的 第 10~8 bit + {0x57, 0x00}, // 水平尺寸的第 9 bit + + // 0xd3 寄存器用于设置像素驱动时钟,即 PCLK 的输出频率,有自动模式和手动模式 + // 在自动模式下,PCLK的频率会非常高,适用于高分辨率或者有高速缓存的场合,用户可根据实际工况选择最合适的模式 + // + // Bit[7]: 设置为1时,开启自动模式,此时 PCLK 由OV2640自动控制,该模式下的PCLK频率非常高, + // 适用于高分辨率或者有高速缓存的场合 + // + // Bit[6:0]:手动设置分频系数,当设置成YUV模式或RGB565模式时, PCLK = sysclk / Bit[6:0] , + // 当 时钟控制寄存器 0x11(CLKRC)设置为 不分频 且外部输入时钟为24M时, + // 在 UXGA模式下, PCLK = 3*24M / Bit[6:0] + // + // 如果要手动配置,用户需要根据实际输出的图像尺寸去计算具体的 PCLK ,这里以 480*360 分辨率为例: + // 一帧 RGB565(16位色) 图像的数据量为:480*360*2 = 345.6 KB , + // OV2640在 SVGA模式下,帧率为30左右,则每秒的数据量在 345.6 * 15 = 5.2 MB 左右, + // 因为模块是8位的接口,则PCLK最少要设置为 5.2 MHz,才能满足图像传输的需求,不然会导致花屏 , + // 加上OV2640的帧率是可以微调的,因此实际的 PCLK 要稍微大些,此处设置为 7.2M, + // 即 PCLK = 72M / Bit[6:0] = 72 / 0x0a = 7.2M + {0xd3, 0x0a}, // R_DVP_SP, 设置 PCLK 引脚的时钟 + + // 手册里没有说明这些寄存器的作用,这里直接保留官方给的设置参数 + {0xe5, 0x1f}, + {0xe1, 0x67}, + {0xdd, 0x7f}, + + {0xe0, 0x00}, // RESET,可选择复位 控制器、SCCB单元、JPEG单元、DVP接口单元等 + {0x05, 0x00}, // 使能DSP + + {0, 0}, // 结束 +}; + +#endif //__DRV_OV2640_CFG_H diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/fal_cfg.h b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/fal_cfg.h new file mode 100644 index 0000000000..d087f07416 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/fal_cfg.h @@ -0,0 +1,60 @@ +/* + * File : fal_cfg.h + * This file is part of FAL (Flash Abstraction Layer) package + * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Change Logs: + * Date Author Notes + * 2018-05-17 armink the first version + */ + +#ifndef _FAL_CFG_H_ +#define _FAL_CFG_H_ + +#ifdef RT_USING_FAL + +#include +#include + +#define FLASH_SIZE_GRANULARITY_128K (16 * 128 * 1024) + +/* ===================== Flash device Configuration ========================= */ +extern const struct fal_flash_dev stm32_onchip_flash_128k; +extern struct fal_flash_dev nor_flash0; +extern struct fal_flash_dev nor_flash1; + +/* flash device table */ +#define FAL_FLASH_DEV_TABLE \ +{ \ + &stm32_onchip_flash_128k, \ + &nor_flash0, \ + &nor_flash1, \ +} +/* ====================== Partition Configuration ========================== */ +#ifdef FAL_PART_HAS_TABLE_CFG +/* partition table */ +#define FAL_PART_TABLE \ +{ \ + {FAL_PART_MAGIC_WORD, "bootloader", "onchip_flash_128k", 0, 128*1024, 0}, \ + {FAL_PART_MAGIC_WORD, "filesystem", FAL_USING_NOR_FLASH_DEV_NAME, 0, 8*1024*1024, 0}, \ + {FAL_PART_MAGIC_WORD, "fs_qspi", "W25Q64_q", 0, 8*1024*1024, 0}, \ +} +#endif /* FAL_PART_HAS_TABLE_CFG */ + +#endif /* RT_USING_FAL */ + +#endif /* _FAL_CFG_H_ */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi.c b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi.c new file mode 100644 index 0000000000..dcbedd6d94 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi.c @@ -0,0 +1,621 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-24 spaceman the first version + */ + +#include + +#ifdef BSP_USING_LCD_SPI +#include +#include +#include +#include +#include + +#define DRV_DEBUG +#define LOG_TAG "drv.lcd" +#include + +#define ABS(X) ((X) > 0 ? (X) : -(X)) + +static struct drv_lcd_device _lcd; +static rt_uint8_t lcd_bn = 0; + +// 因为这类SPI的屏幕,每次更新显示时,需要先配置坐标区域、再写显存, +// 在显示字符时,如果是一个个点去写坐标写显存,会非常慢, +// 因此开辟一片缓冲区,先将需要显示的数据写进缓冲区,最后再批量写入显存。 +// 用户可以根据实际情况去修改此处缓冲区的大小, +// 例如,用户需要显示32*32的汉字时,需要的大小为 32*32*2 = 2048 字节(每个像素点占2字节) +static uint16_t LCD_Buff[1024]; // LCD缓冲区,16位宽(每个像素点占2字节) + +static void set_lcd_backlight(rt_uint8_t value) +{ + if (value) + rt_pin_write(LCD_BACKLIGHT_PIN, PIN_HIGH); + else + rt_pin_write(LCD_BACKLIGHT_PIN, PIN_LOW); + lcd_bn = value; +} + +static rt_uint8_t get_lcd_backlight(void) +{ + return lcd_bn; +} + +static void lcd_writecommand(uint8_t lcd_command) +{ + rt_pin_write(LCD_CMD_DATA_PIN, PIN_LOW); // cmd + rt_spi_send((struct rt_spi_device *)_lcd.lcd_spi_dev, &lcd_command, 1); +} + +static void lcd_writedata_8bit(uint8_t lcd_data) +{ + rt_pin_write(LCD_CMD_DATA_PIN, PIN_HIGH); // data + rt_spi_send((struct rt_spi_device *)_lcd.lcd_spi_dev, &lcd_data, 1); +} + +static void lcd_writedata_16bit(uint16_t lcd_data) +{ + uint8_t lcd_data_buff[2]; // 数据发送区 + lcd_data_buff[0] = lcd_data >> 8; // 将数据拆分 + lcd_data_buff[1] = lcd_data; + + rt_pin_write(LCD_CMD_DATA_PIN, PIN_HIGH); // data + rt_spi_send((struct rt_spi_device *)_lcd.lcd_spi_dev, lcd_data_buff, 2); +} + +void lcd_writebuff(uint16_t *databuff, uint16_t datasize) +{ + struct stm32_spi *spi_drv = rt_container_of(((struct rt_spi_device *)_lcd.lcd_spi_dev)->bus, struct stm32_spi, spi_bus); + SPI_HandleTypeDef *spi_handle = &spi_drv->handle; + + rt_pin_write(LCD_CMD_DATA_PIN, PIN_HIGH); // data + + // Additional setting (FifoThreshold) are required here, so we do not use rt_spi_configure + spi_handle->Init.DataSize = SPI_DATASIZE_16BIT; + spi_handle->Init.FifoThreshold = SPI_FIFO_THRESHOLD_02DATA; + HAL_SPI_Init(spi_handle); + + rt_spi_send((struct rt_spi_device *)_lcd.lcd_spi_dev, databuff, datasize); + + spi_handle->Init.DataSize = SPI_DATASIZE_8BIT; + spi_handle->Init.FifoThreshold = SPI_FIFO_THRESHOLD_08DATA; + HAL_SPI_Init(spi_handle); +} + +void lcd_setaddress(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) +{ + lcd_writecommand(0x2a); // 列地址设置,即X坐标 + lcd_writedata_16bit(x1); + lcd_writedata_16bit(x2); + + lcd_writecommand(0x2b); // 行地址设置,即Y坐标 + lcd_writedata_16bit(y1); + lcd_writedata_16bit(y2); + + lcd_writecommand(0x2c); // 开始写入显存,即要显示的颜色数据 +} + +void lcd_clear(uint32_t color) +{ + rt_err_t res; + struct stm32_spi *spi_drv = rt_container_of(((struct rt_spi_device *)_lcd.lcd_spi_dev)->bus, struct stm32_spi, spi_bus); + SPI_HandleTypeDef *spi_handle = &spi_drv->handle; + + lcd_setaddress(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1); // 设置坐标 + + rt_pin_write(LCD_CMD_DATA_PIN, PIN_HIGH); // data + + // Additional setting (FifoThreshold) are required here, so we do not use rt_spi_configure + spi_handle->Init.DataSize = SPI_DATASIZE_16BIT; + spi_handle->Init.FifoThreshold = SPI_FIFO_THRESHOLD_02DATA; + HAL_SPI_Init(spi_handle); + + rt_pin_write(LCD_SPI_DEV_CS_PIN, PIN_LOW); // cs + res = SPI_Transmit_Ext((uint16_t)color, LCD_WIDTH * LCD_HEIGHT); + rt_pin_write(LCD_SPI_DEV_CS_PIN, PIN_HIGH); // cs + if(res != RT_EOK) + LOG_E("SPI_Transmit_Ext error: %d", res); + + spi_handle->Init.DataSize = SPI_DATASIZE_8BIT; + spi_handle->Init.FifoThreshold = SPI_FIFO_THRESHOLD_08DATA; + HAL_SPI_Init(spi_handle); +} + +void lcd_clearrect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint32_t color) +{ + rt_err_t res; + struct stm32_spi *spi_drv = rt_container_of(((struct rt_spi_device *)_lcd.lcd_spi_dev)->bus, struct stm32_spi, spi_bus); + SPI_HandleTypeDef *spi_handle = &spi_drv->handle; + + lcd_setaddress(x, y, x + width - 1, y + height - 1); // 设置坐标 + + rt_pin_write(LCD_CMD_DATA_PIN, PIN_HIGH); // data + + // Additional setting (FifoThreshold) are required here, so we do not use rt_spi_configure + spi_handle->Init.DataSize = SPI_DATASIZE_16BIT; + spi_handle->Init.FifoThreshold = SPI_FIFO_THRESHOLD_02DATA; + HAL_SPI_Init(spi_handle); + + rt_pin_write(LCD_SPI_DEV_CS_PIN, PIN_LOW); // cs + res = SPI_Transmit_Ext((uint16_t)color, width * height); + rt_pin_write(LCD_SPI_DEV_CS_PIN, PIN_HIGH); // cs + if(res != RT_EOK) + LOG_E("SPI_Transmit_Ext error: %d", res); + + spi_handle->Init.DataSize = SPI_DATASIZE_8BIT; + spi_handle->Init.FifoThreshold = SPI_FIFO_THRESHOLD_08DATA; + HAL_SPI_Init(spi_handle); +} + +void lcd_copybuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t *databuff) +{ + rt_err_t res; + struct stm32_spi *spi_drv = rt_container_of(((struct rt_spi_device *)_lcd.lcd_spi_dev)->bus, struct stm32_spi, spi_bus); + SPI_HandleTypeDef *spi_handle = &spi_drv->handle; + + lcd_setaddress(x, y, x + width - 1, y + height - 1); // 设置坐标 + + rt_pin_write(LCD_CMD_DATA_PIN, PIN_HIGH); // data + + // Additional setting (FifoThreshold) are required here, so we do not use rt_spi_configure + spi_handle->Init.DataSize = SPI_DATASIZE_16BIT; + spi_handle->Init.FifoThreshold = SPI_FIFO_THRESHOLD_02DATA; + HAL_SPI_Init(spi_handle); + + rt_pin_write(LCD_SPI_DEV_CS_PIN, PIN_LOW); // cs + res = SPI_TransmitBuffer_Ext(databuff, width * height); + rt_pin_write(LCD_SPI_DEV_CS_PIN, PIN_HIGH); // cs + if(res != RT_EOK) + LOG_E("SPI_TransmitBuffer_Ext error: %d", res); + + spi_handle->Init.DataSize = SPI_DATASIZE_8BIT; + spi_handle->Init.FifoThreshold = SPI_FIFO_THRESHOLD_08DATA; + HAL_SPI_Init(spi_handle); +} + +void lcd_drawpoint(uint16_t x, uint16_t y, uint32_t color) +{ + lcd_setaddress(x, y, x, y); // 设置坐标 + lcd_writedata_16bit(color); +} + +void lcd_drawline(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint32_t color) +{ + int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0, + yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0, + curpixel = 0; + + deltax = ABS(x2 - x1); /* The difference between the x's */ + deltay = ABS(y2 - y1); /* The difference between the y's */ + x = x1; /* Start x off at the first pixel */ + y = y1; /* Start y off at the first pixel */ + + if (x2 >= x1) /* The x-values are increasing */ + { + xinc1 = 1; + xinc2 = 1; + } else /* The x-values are decreasing */ + { + xinc1 = -1; + xinc2 = -1; + } + + if (y2 >= y1) /* The y-values are increasing */ + { + yinc1 = 1; + yinc2 = 1; + } else /* The y-values are decreasing */ + { + yinc1 = -1; + yinc2 = -1; + } + + if (deltax >= deltay) /* There is at least one x-value for every y-value */ + { + xinc1 = 0; /* Don't change the x when numerator >= denominator */ + yinc2 = 0; /* Don't change the y for every iteration */ + den = deltax; + num = deltax / 2; + numadd = deltay; + numpixels = deltax; /* There are more x-values than y-values */ + } else /* There is at least one y-value for every x-value */ + { + xinc2 = 0; /* Don't change the x for every iteration */ + yinc1 = 0; /* Don't change the y when numerator >= denominator */ + den = deltay; + num = deltay / 2; + numadd = deltax; + numpixels = deltay; /* There are more y-values than x-values */ + } + for (curpixel = 0; curpixel <= numpixels; curpixel++) { + lcd_drawpoint(x, y, color); /* Draw the current pixel */ + num += numadd; /* Increase the numerator by the top of the fraction */ + if (num >= den) /* Check if numerator >= denominator */ + { + num -= den; /* Calculate the new numerator value */ + x += xinc1; /* Change the x as appropriate */ + y += yinc1; /* Change the y as appropriate */ + } + x += xinc2; /* Change the x as appropriate */ + y += yinc2; /* Change the y as appropriate */ + } +} + +void lcd_drawline_v(uint16_t x, uint16_t y, uint16_t height, uint32_t color) +{ + uint16_t i; // 计数变量 + for (i = 0; i < height; i++) { + LCD_Buff[i] = color; // 写入缓冲区 + } + lcd_setaddress(x, y, x, y + height - 1); // 设置坐标 + lcd_writebuff(LCD_Buff, height); // 写入显存 +} + +void lcd_drawline_h(uint16_t x, uint16_t y, uint16_t width, uint32_t color) +{ + uint16_t i; // 计数变量 + for (i = 0; i < width; i++) { + LCD_Buff[i] = color; // 写入缓冲区 + } + lcd_setaddress(x, y, x + width - 1, y); // 设置坐标 + lcd_writebuff(LCD_Buff, width); // 写入显存 +} + +static rt_err_t stm32_lcd_init(struct drv_lcd_device *lcd) +{ + rt_err_t result; + struct rt_spi_configuration cfg; + + result = rt_hw_spi_device_attach(LCD_SPI_BUS_NAME, LCD_SPI_DEV_NAME, LCD_SPI_DEV_CS_PIN); + + lcd->lcd_spi_dev = rt_device_find(LCD_SPI_DEV_NAME); + cfg.data_width = 8; + cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB | RT_SPI_3WIRE; + cfg.max_hz = LCD_SPI_MAX_SPEED; + rt_spi_configure((struct rt_spi_device *)lcd->lcd_spi_dev, &cfg); + + rt_pin_mode(LCD_BACKLIGHT_PIN, PIN_MODE_OUTPUT); + rt_pin_mode(LCD_CMD_DATA_PIN, PIN_MODE_OUTPUT); + + // init lcd + rt_thread_mdelay(10); + lcd_writecommand(0x36); // 显存访问控制 指令,用于设置访问显存的方式 + lcd_writedata_8bit(0x00); // 配置成 从上到下、从左到右,RGB像素格式 垂直显示 + // lcd_writedata_8bit(0x70); // 横屏显示 + // lcd_writedata_8bit(0xA0); // 横屏显示,并上下翻转,RGB像素格式 + // lcd_writedata_8bit(0xC0); // 垂直显示,并上下翻转,RGB像素格式 + + lcd_writecommand(0x3A); // 接口像素格式 指令,用于设置使用 12位、16位还是18位色 + lcd_writedata_8bit(0x05); // 此处配置成 16位 像素格式 + + // 接下来很多都是电压设置指令,直接使用厂家给设定值 + lcd_writecommand(0xB2); + lcd_writedata_8bit(0x0C); + lcd_writedata_8bit(0x0C); + lcd_writedata_8bit(0x00); + lcd_writedata_8bit(0x33); + lcd_writedata_8bit(0x33); + + lcd_writecommand(0xB7); // 栅极电压设置指令 + lcd_writedata_8bit(0x35); // VGH = 13.26V,VGL = -10.43V + + lcd_writecommand(0xBB); // 公共电压设置指令 + lcd_writedata_8bit(0x19); // VCOM = 1.35V + + lcd_writecommand(0xC0); + lcd_writedata_8bit(0x2C); + + lcd_writecommand(0xC2); // VDV 和 VRH 来源设置 + lcd_writedata_8bit(0x01); // VDV 和 VRH 由用户自由配置 + + lcd_writecommand(0xC3); // VRH电压 设置指令 + lcd_writedata_8bit(0x12); // VRH电压 = 4.6+( vcom+vcom offset+vdv) + + lcd_writecommand(0xC4); // VDV电压 设置指令 + lcd_writedata_8bit(0x20); // VDV电压 = 0v + + lcd_writecommand(0xC6); // 正常模式的帧率控制指令 + lcd_writedata_8bit(0x0F); // 设置屏幕控制器的刷新帧率为60帧 + + lcd_writecommand(0xD0); // 电源控制指令 + lcd_writedata_8bit(0xA4); // 无效数据,固定写入0xA4 + lcd_writedata_8bit(0xA1); // AVDD = 6.8V ,AVDD = -4.8V ,VDS = 2.3V + + lcd_writecommand(0xE0); // 正极电压伽马值设定 + lcd_writedata_8bit(0xD0); + lcd_writedata_8bit(0x04); + lcd_writedata_8bit(0x0D); + lcd_writedata_8bit(0x11); + lcd_writedata_8bit(0x13); + lcd_writedata_8bit(0x2B); + lcd_writedata_8bit(0x3F); + lcd_writedata_8bit(0x54); + lcd_writedata_8bit(0x4C); + lcd_writedata_8bit(0x18); + lcd_writedata_8bit(0x0D); + lcd_writedata_8bit(0x0B); + lcd_writedata_8bit(0x1F); + lcd_writedata_8bit(0x23); + + lcd_writecommand(0xE1); // 负极电压伽马值设定 + lcd_writedata_8bit(0xD0); + lcd_writedata_8bit(0x04); + lcd_writedata_8bit(0x0C); + lcd_writedata_8bit(0x11); + lcd_writedata_8bit(0x13); + lcd_writedata_8bit(0x2C); + lcd_writedata_8bit(0x3F); + lcd_writedata_8bit(0x44); + lcd_writedata_8bit(0x51); + lcd_writedata_8bit(0x2F); + lcd_writedata_8bit(0x1F); + lcd_writedata_8bit(0x1F); + lcd_writedata_8bit(0x20); + lcd_writedata_8bit(0x23); + + lcd_writecommand(0x21); // 打开反显,因为面板是常黑型,操作需要反过来 + + // 退出休眠指令,LCD控制器在刚上电、复位时,会自动进入休眠模式 ,因此操作屏幕之前,需要退出休眠 + lcd_writecommand(0x11); // 退出休眠 指令 + rt_thread_mdelay(120); // 需要等待120ms,让电源电压和时钟电路稳定下来 + + // 打开显示指令,LCD控制器在刚上电、复位时,会自动关闭显示 + lcd_writecommand(0x29); // 打开显示 + + // set spi handler to ensure SPI_Transmit_Ext/SPI_TransmitBuffer_Ext function can be used + struct stm32_spi *spi_drv = rt_container_of(((struct rt_spi_device *)lcd->lcd_spi_dev)->bus, struct stm32_spi, spi_bus); + SPI_HandleTypeDef *spi_handle = &spi_drv->handle; + Set_SPI_Handle_Ext(spi_handle); + + lcd_clear(0xFFFFFF); // 清屏 + + // 全部设置完毕之后,打开背光 + set_lcd_backlight(1); + + LOG_D("lcd init ok"); + + // lcd_drawline_v(120, 0, LCD_HEIGHT, 0xffaaff); + // lcd_drawline_h(0, 120, LCD_WIDTH, 0xffaaff); + + return result; +} + +static rt_err_t drv_lcd_init(struct rt_device *device) +{ + struct drv_lcd_device *lcd = LCD_DEVICE(device); + return stm32_lcd_init(lcd); +} + +static rt_err_t drv_lcd_control(struct rt_device *device, int cmd, void *args) +{ + struct drv_lcd_device *lcd = LCD_DEVICE(device); + + switch (cmd) { + case RTGRAPHIC_CTRL_RECT_UPDATE: { + lcd_setaddress(0, 0, lcd->lcd_info.width - 1, lcd->lcd_info.height - 1); + lcd_writebuff((uint16_t*)lcd->lcd_info.framebuffer, LCD_BUF_SIZE / 2); // 16 bit write buffer + } break; + + case RTGRAPHIC_CTRL_GET_INFO: { + struct rt_device_graphic_info *info = (struct rt_device_graphic_info *)args; + + RT_ASSERT(info != RT_NULL); + info->pixel_format = lcd->lcd_info.pixel_format; + info->bits_per_pixel = 16; + info->width = lcd->lcd_info.width; + info->height = lcd->lcd_info.height; + info->framebuffer = lcd->lcd_info.framebuffer; + } break; + + case RTGRAPHIC_CTRL_SET_BRIGHTNESS: { + set_lcd_backlight(*((rt_uint8_t *)args)); + } break; + + case RTGRAPHIC_CTRL_GET_BRIGHTNESS: { + *((rt_uint8_t *)args) = get_lcd_backlight(); + } break; + + default: + return -RT_EINVAL; + } + + return RT_EOK; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops lcd_ops = +{ + drv_lcd_init, + RT_NULL, + RT_NULL, + RT_NULL, + RT_NULL, + drv_lcd_control +}; +#endif + +static void set_pixel(const char *pixel, int x, int y) +{ + lcd_drawpoint(x, y, *pixel); +} + +void draw_hline(const char *pixel, int x1, int x2, int y) +{ + lcd_drawline_h(x1, y, ABS(x2 - x1), *((uint16_t*)pixel)); +} + +void draw_vline(const char *pixel, int x, int y1, int y2) +{ + lcd_drawline_v(x, y1, ABS(y2 - y1), *((uint16_t*)pixel)); +} + +const static struct rt_device_graphic_ops lcd_graphic_ops = +{ + set_pixel, + RT_NULL, + draw_hline, + draw_vline, + RT_NULL +}; + +int drv_hw_lcd_init(void) +{ + rt_err_t result = RT_EOK; + struct rt_device *device = &_lcd.parent; + + /* memset _lcd to zero */ + memset(&_lcd, 0x00, sizeof(_lcd)); + + /* init lcd_lock semaphore */ + result = rt_sem_init(&_lcd.lcd_lock, "lcd_lock", 0, RT_IPC_FLAG_FIFO); + if (result != RT_EOK) { + LOG_E("init semaphore failed!\n"); + result = -RT_ENOMEM; + goto __exit; + } + + /* config LCD dev info */ + _lcd.lcd_info.height = LCD_HEIGHT; + _lcd.lcd_info.width = LCD_WIDTH; + _lcd.lcd_info.bits_per_pixel = LCD_BITS_PER_PIXEL; + _lcd.lcd_info.pixel_format = LCD_PIXEL_FORMAT; + + /* malloc memory for Triple Buffering */ + _lcd.lcd_info.framebuffer = rt_malloc_align(LCD_BUF_SIZE, 32); + _lcd.back_buf = rt_malloc_align(LCD_BUF_SIZE, 32); + _lcd.front_buf = rt_malloc_align(LCD_BUF_SIZE, 32); + if (_lcd.lcd_info.framebuffer == RT_NULL || _lcd.back_buf == RT_NULL || _lcd.front_buf == RT_NULL) { + LOG_E("init frame buffer failed!\n"); + result = -RT_ENOMEM; + goto __exit; + } + + /* memset buff to 0xFF */ + memset(_lcd.lcd_info.framebuffer, 0xFF, LCD_BUF_SIZE); + memset(_lcd.back_buf, 0xFF, LCD_BUF_SIZE); + memset(_lcd.front_buf, 0xFF, LCD_BUF_SIZE); + + device->type = RT_Device_Class_Graphic; +#ifdef RT_USING_DEVICE_OPS + device->ops = &lcd_ops; +#else + device->init = drv_lcd_init; + device->control = drv_lcd_control; +#endif + device->user_data = (void*)&lcd_graphic_ops; + + /* register lcd device */ + rt_device_register(device, "lcd", RT_DEVICE_FLAG_RDWR); + + /* init stm32 spi lcd */ + if (rt_device_init(device) != RT_EOK) { + result = -RT_ERROR; + goto __exit; + } + +__exit: + if (result != RT_EOK) { + rt_sem_delete(&_lcd.lcd_lock); + + if (_lcd.lcd_info.framebuffer) { + rt_free_align(_lcd.lcd_info.framebuffer); + } + + if (_lcd.back_buf) { + rt_free_align(_lcd.back_buf); + } + + if (_lcd.front_buf) { + rt_free_align(_lcd.front_buf); + } + } + return result; +} +INIT_DEVICE_EXPORT(drv_hw_lcd_init); + +#ifdef DRV_DEBUG +#ifdef FINSH_USING_MSH +int lcd_test() +{ + struct drv_lcd_device *lcd; + lcd = (struct drv_lcd_device *)rt_device_find("lcd"); + + rt_device_open((rt_device_t)lcd, RT_DEVICE_FLAG_RDWR); + + while (1) { + /* red */ + for (int i = 0; i < LCD_BUF_SIZE / 2; i++) { + lcd->lcd_info.framebuffer[2 * i] = 0x00; + lcd->lcd_info.framebuffer[2 * i + 1] = 0xF8; + } + // lcd_clear(0xFFFF00); + rt_device_control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL); + rt_thread_mdelay(1000); + /* green */ + for (int i = 0; i < LCD_BUF_SIZE / 2; i++) { + lcd->lcd_info.framebuffer[2 * i] = 0xE0; + lcd->lcd_info.framebuffer[2 * i + 1] = 0x07; + } + // lcd_clear(0xFF00FF); + rt_device_control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL); + rt_thread_mdelay(1000); + /* blue */ + for (int i = 0; i < LCD_BUF_SIZE / 2; i++) { + lcd->lcd_info.framebuffer[2 * i] = 0x1F; + lcd->lcd_info.framebuffer[2 * i + 1] = 0x00; + } + // lcd_clear(0x00FFFF); + rt_device_control(&lcd->parent, RTGRAPHIC_CTRL_RECT_UPDATE, RT_NULL); + rt_thread_mdelay(1000); + } +} +MSH_CMD_EXPORT(lcd_test, lcd_test); + +void lcd_auto_fill(void *para) +{ + int num = (int)para; + do + { + lcd_clear(rt_tick_get()); + rt_thread_mdelay(1000); + }while(--num); +} + +#include /* atoi */ +void lcd_fill(int argc, void **argv) +{ + static rt_uint8_t lcd_init = 0; + rt_device_t lcd = RT_NULL; + + if(lcd_init == 0) + { + lcd_init = 1; + + lcd = rt_device_find("lcd"); + rt_device_init(lcd); + } + + if(argc == 1) + { + lcd_auto_fill((void *)1); + } + else if(argc == 3) + { + if(rt_strcmp(argv[1], "-t")==0) + { + rt_thread_t tid = RT_NULL; + tid = rt_thread_create("lcd_fill", lcd_auto_fill, (void *)atoi(argv[2]), 512, 23,10); + rt_thread_startup(tid); + } + } +} +MSH_CMD_EXPORT(lcd_fill, lcd fill test for mcu lcd); +#endif /* FINSH_USING_MSH */ +#endif /* DRV_DEBUG */ +#endif /* BSP_USING_LCD */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi.h b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi.h new file mode 100644 index 0000000000..1a51905feb --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-24 spaceman the first version + */ + +#ifndef __DRV_LCD_SPI_H__ +#define __DRV_LCD_SPI_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define LCD_DEVICE(dev) (struct drv_lcd_device*)(dev) + +struct drv_lcd_device +{ + struct rt_device parent; + rt_device_t lcd_spi_dev; + + struct rt_device_graphic_info lcd_info; + + struct rt_semaphore lcd_lock; + + /* 0:front_buf is being used 1: back_buf is being used*/ + rt_uint8_t cur_buf; + rt_uint8_t *front_buf; + rt_uint8_t *back_buf; +}; + + + +void lcd_writebuff(uint16_t *databuff, uint16_t datasize); + +void lcd_setaddress(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); + +void lcd_clear(uint32_t color); +void lcd_clearrect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint32_t color); +void lcd_copybuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t *databuff); + +void lcd_drawpoint(uint16_t x, uint16_t y, uint32_t color); + +void lcd_drawline(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint32_t color); +void lcd_drawline_v(uint16_t x, uint16_t y, uint16_t height, uint32_t color); +void lcd_drawline_h(uint16_t x, uint16_t y, uint16_t width, uint32_t color); + +#ifdef __cplusplus +} +#endif + +#endif /* __DRV_LCD_SPI_H__ */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi_ext.c b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi_ext.c new file mode 100644 index 0000000000..f1eeb5939d --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi_ext.c @@ -0,0 +1,332 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-24 spaceman the first version + */ + +#include "drv_lcd_spi_ext.h" +#include "stm32h7xx_hal.h" + +static SPI_HandleTypeDef* spi_handle; + +void Set_SPI_Handle_Ext(SPI_HandleTypeDef *handle) +{ + spi_handle = handle; +} + +/** + * @brief Handle SPI Communication Timeout. + * @param hspi: pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param Flag: SPI flag to check + * @param Status: flag state to check + * @param Timeout: Timeout duration + * @param Tickstart: Tick start value + * @retval HAL status + */ +HAL_StatusTypeDef LCD_SPI_WaitOnFlagUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout) +{ + /* Wait until flag is set */ + while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) == Status) { + /* Check for the Timeout */ + if ((((HAL_GetTick() - Tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Close Transfer and clear flags. + * @param hspi: pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval HAL_ERROR: if any error detected + * HAL_OK: if nothing detected + */ +void LCD_SPI_CloseTransfer(SPI_HandleTypeDef *hspi) +{ + uint32_t itflag = hspi->Instance->SR; + + __HAL_SPI_CLEAR_EOTFLAG(hspi); + __HAL_SPI_CLEAR_TXTFFLAG(hspi); + + /* Disable SPI peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Disable ITs */ + __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_EOT | SPI_IT_TXP | SPI_IT_RXP | SPI_IT_DXP | SPI_IT_UDR | SPI_IT_OVR | SPI_IT_FRE | SPI_IT_MODF)); + + /* Disable Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CFG1, SPI_CFG1_TXDMAEN | SPI_CFG1_RXDMAEN); + + /* Report UnderRun error for non RX Only communication */ + if (hspi->State != HAL_SPI_STATE_BUSY_RX) { + if ((itflag & SPI_FLAG_UDR) != 0UL) { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_UDR); + __HAL_SPI_CLEAR_UDRFLAG(hspi); + } + } + + /* Report OverRun error for non TX Only communication */ + if (hspi->State != HAL_SPI_STATE_BUSY_TX) { + if ((itflag & SPI_FLAG_OVR) != 0UL) { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR); + __HAL_SPI_CLEAR_OVRFLAG(hspi); + } + } + + /* SPI Mode Fault error interrupt occurred -------------------------------*/ + if ((itflag & SPI_FLAG_MODF) != 0UL) { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF); + __HAL_SPI_CLEAR_MODFFLAG(hspi); + } + + /* SPI Frame error interrupt occurred ------------------------------------*/ + if ((itflag & SPI_FLAG_FRE) != 0UL) { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE); + __HAL_SPI_CLEAR_FREFLAG(hspi); + } + + hspi->TxXferCount = (uint16_t)0UL; + hspi->RxXferCount = (uint16_t)0UL; +} + +/** + * @brief 专为屏幕清屏而修改,将需要清屏的颜色批量传输 + * @param pData : 要写入的数据 + * @param Size : 数据大小 + * @retval status + */ + +rt_err_t SPI_Transmit_Ext(uint16_t pData, uint32_t Size) +{ + uint32_t tickstart; + uint32_t Timeout = 1000; // 超时判断 + uint32_t LCD_pData_32bit; // 按32位传输时的数据 + uint32_t LCD_TxDataCount; // 传输计数 + rt_err_t errorcode = RT_EOK; + SPI_HandleTypeDef *hspi = spi_handle; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE_2LINES_TXONLY(hspi->Init.Direction)); + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + if (hspi->State != HAL_SPI_STATE_READY) { + errorcode = -RT_EBUSY; + __HAL_UNLOCK(hspi); + return errorcode; + } + + if (Size == 0UL) { + errorcode = -RT_ERROR; + __HAL_UNLOCK(hspi); + return errorcode; + } + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_TX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + + LCD_TxDataCount = Size; // 传输的数据长度 + LCD_pData_32bit = (pData << 16) | pData; // 按32位传输时,合并2个像素点的颜色 + + /*Init field not used in handle to zero */ + hspi->pRxBuffPtr = NULL; + hspi->RxXferSize = (uint16_t)0UL; + hspi->RxXferCount = (uint16_t)0UL; + hspi->TxISR = NULL; + hspi->RxISR = NULL; + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) { + SPI_1LINE_TX(hspi); + } + + // 不使用硬件 TSIZE 控制,此处设置为0,即不限制传输的数据长度 + MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, 0); + + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + + if (hspi->Init.Mode == SPI_MODE_MASTER) { + /* Master transfer start */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CSTART); + } + + /* Transmit data in 16 Bit mode */ + while (LCD_TxDataCount > 0UL) { + /* Wait until TXP flag is set to send data */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP)) { + if ((hspi->TxXferCount > 1UL) && (hspi->Init.FifoThreshold > SPI_FIFO_THRESHOLD_01DATA)) { + *((__IO uint32_t *)&hspi->Instance->TXDR) = (uint32_t)LCD_pData_32bit; + LCD_TxDataCount -= (uint16_t)2UL; + } else { + *((__IO uint16_t *)&hspi->Instance->TXDR) = (uint16_t)pData; + LCD_TxDataCount--; + } + } else { + /* Timeout management */ + if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) { + /* Call standard close procedure with error check */ + LCD_SPI_CloseTransfer(hspi); + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT); + hspi->State = HAL_SPI_STATE_READY; + return -RT_ERROR; + } + } + } + + if (LCD_SPI_WaitOnFlagUntilTimeout(hspi, SPI_SR_TXC, RESET, tickstart, Timeout) != HAL_OK) { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + + SET_BIT((hspi)->Instance->CR1, SPI_CR1_CSUSP); // 请求挂起SPI传输 + /* 等待SPI挂起 */ + if (LCD_SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_SUSP, RESET, tickstart, Timeout) != HAL_OK) { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + LCD_SPI_CloseTransfer(hspi); /* Call standard close procedure with error check */ + + SET_BIT((hspi)->Instance->IFCR, SPI_IFCR_SUSPC); // 清除挂起标志位 + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + hspi->State = HAL_SPI_STATE_READY; + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) { + return -RT_ERROR; + } + return errorcode; +} + +/** + * @brief 专为批量写入数据修改,使之不限长度的传输数据 + * @param pData : 要写入的数据 + * @param Size : 数据大小 + * @retval status + */ +rt_err_t SPI_TransmitBuffer_Ext(uint16_t *pData, uint32_t Size) +{ + uint32_t tickstart; + uint32_t Timeout = 1000; // 超时判断 + uint32_t LCD_TxDataCount; // 传输计数 + rt_err_t errorcode = RT_EOK; + SPI_HandleTypeDef *hspi = spi_handle; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE_2LINES_TXONLY(hspi->Init.Direction)); + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + if (hspi->State != HAL_SPI_STATE_READY) { + errorcode = -RT_EBUSY; + __HAL_UNLOCK(hspi); + return errorcode; + } + + if (Size == 0UL) { + errorcode = -RT_ERROR; + __HAL_UNLOCK(hspi); + return errorcode; + } + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_TX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + + LCD_TxDataCount = Size; // 传输的数据长度 + + /*Init field not used in handle to zero */ + hspi->pRxBuffPtr = NULL; + hspi->RxXferSize = (uint16_t)0UL; + hspi->RxXferCount = (uint16_t)0UL; + hspi->TxISR = NULL; + hspi->RxISR = NULL; + + /* Configure communication direction : 1Line */ + if (hspi->Init.Direction == SPI_DIRECTION_1LINE) { + SPI_1LINE_TX(hspi); + } + + // 不使用硬件 TSIZE 控制,此处设置为0,即不限制传输的数据长度 + MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, 0); + + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + + if (hspi->Init.Mode == SPI_MODE_MASTER) { + /* Master transfer start */ + SET_BIT(hspi->Instance->CR1, SPI_CR1_CSTART); + } + + /* Transmit data in 16 Bit mode */ + while (LCD_TxDataCount > 0UL) { + /* Wait until TXP flag is set to send data */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP)) { + if ((LCD_TxDataCount > 1UL) && (hspi->Init.FifoThreshold > SPI_FIFO_THRESHOLD_01DATA)) { + *((__IO uint32_t *)&hspi->Instance->TXDR) = *((uint32_t *)pData); + pData += 2; + LCD_TxDataCount -= 2; + } else { + *((__IO uint16_t *)&hspi->Instance->TXDR) = *((uint16_t *)pData); + pData += 1; + LCD_TxDataCount--; + } + } else { + /* Timeout management */ + if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) { + /* Call standard close procedure with error check */ + LCD_SPI_CloseTransfer(hspi); + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT); + hspi->State = HAL_SPI_STATE_READY; + return -RT_ERROR; + } + } + } + + if (LCD_SPI_WaitOnFlagUntilTimeout(hspi, SPI_SR_TXC, RESET, tickstart, Timeout) != HAL_OK) { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + + SET_BIT((hspi)->Instance->CR1, SPI_CR1_CSUSP); // 请求挂起SPI传输 + /* 等待SPI挂起 */ + if (LCD_SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_SUSP, RESET, tickstart, Timeout) != HAL_OK) { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + } + LCD_SPI_CloseTransfer(hspi); /* Call standard close procedure with error check */ + + SET_BIT((hspi)->Instance->IFCR, SPI_IFCR_SUSPC); // 清除挂起标志位 + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + + hspi->State = HAL_SPI_STATE_READY; + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) { + return -RT_ERROR; + } + return errorcode; +} diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi_ext.h b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi_ext.h new file mode 100644 index 0000000000..cf113de627 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/drv_lcd_spi_ext.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-24 spaceman the first version + */ + +#ifndef __DRV_LCD_SPI_EXT_H__ +#define __DRV_LCD_SPI_EXT_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void Set_SPI_Handle_Ext(SPI_HandleTypeDef *handle); + +/** + * @brief 专为屏幕清屏而修改,将需要清屏的颜色批量传输 + * @param pData : 要写入的数据 + * @param Size : 数据大小 + * @retval status + */ + +rt_err_t SPI_Transmit_Ext(uint16_t pData, uint32_t Size); + +/** + * @brief 专为批量写入数据修改,使之不限长度的传输数据 + * @param pData : 要写入的数据 + * @param Size : 数据大小 + * @retval status + */ +rt_err_t SPI_TransmitBuffer_Ext(uint16_t *pData, uint32_t Size); + +#ifdef __cplusplus +} +#endif + +#endif /* __DRV_LCD_SPI_EXT_H__ */ diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/lcd_port.h b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/lcd_port.h new file mode 100644 index 0000000000..411f8aab91 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/board/port/lcd/lcd_port.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-03-24 spaceman the first version + */ + +#ifndef __LCD_PORT_H__ +#define __LCD_PORT_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +//LCD +#define LCD_HEIGHT (240U) +#define LCD_WIDTH (240U) +#define LCD_BITS_PER_PIXEL (16) +#define LCD_PIXEL_FORMAT (RTGRAPHIC_PIXEL_FORMAT_RGB565) +#define LCD_BUF_SIZE (LCD_WIDTH*LCD_HEIGHT*LCD_BITS_PER_PIXEL/8) +//BACKLIGHT +#define LCD_BACKLIGHT_PIN (GET_PIN(D, 15)) +//CMD/DATA +#define LCD_CMD_DATA_PIN (GET_PIN(E, 15)) +//SPI +#define LCD_SPI_BUS_NAME "spi4" +#define LCD_SPI_DEV_NAME "spi40" +#define LCD_SPI_DEV_CS_PIN (GET_PIN(E, 11)) +#define LCD_SPI_MAX_SPEED (60 * 1000 *1000) /* 60M */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LCD_PORT_H__ */ + diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/figures/board.jpg b/bsp/stm32/stm32h750-fk750m1-vbt6/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4cc6f62b266f471d25b611b6d10e6a71018cc904 GIT binary patch literal 492112 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%0A67od@;clFj0T? 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≪p0Z=VWrOSYFf(-UE7n= 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≺&Djd}0%hIUdGJ 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�~rG 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 C-UMX; literal 0 HcmV?d00001 diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/project.ewp b/bsp/stm32/stm32h750-fk750m1-vbt6/project.ewp new file mode 100644 index 0000000000..2f40f32cd3 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/project.ewp @@ -0,0 +1,2329 @@ + + 3 + + rtthread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + cpu + + $PROJ_DIR$\rt-thread\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\rt-thread\libcpu\arm\common\div0.c + + + $PROJ_DIR$\rt-thread\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\rt-thread\libcpu\arm\cortex-m7\cpu_cache.c + + + $PROJ_DIR$\rt-thread\libcpu\arm\cortex-m7\cpuport.c + + + $PROJ_DIR$\rt-thread\libcpu\arm\cortex-m7\context_iar.S + + + + DeviceDrivers + + $PROJ_DIR$\rt-thread\components\drivers\hwcrypto\hwcrypto.c + + + $PROJ_DIR$\rt-thread\components\drivers\hwcrypto\hw_rng.c + + + $PROJ_DIR$\rt-thread\components\drivers\hwcrypto\hw_crc.c + + + $PROJ_DIR$\rt-thread\components\drivers\misc\pin.c + + + $PROJ_DIR$\rt-thread\components\drivers\serial\serial.c + + + $PROJ_DIR$\rt-thread\components\drivers\src\completion.c + + + $PROJ_DIR$\rt-thread\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\rt-thread\components\drivers\src\pipe.c + + + $PROJ_DIR$\rt-thread\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\rt-thread\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\rt-thread\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\rt-thread\components\drivers\src\workqueue.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32h7xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Source\Templates\iar\startup_stm32h743xx.s + + + $PROJ_DIR$\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\libraries\HAL_Drivers\drv_crypto.c + + + $PROJ_DIR$\libraries\HAL_Drivers\drv_common.c + + + + finsh + + $PROJ_DIR$\rt-thread\components\finsh\shell.c + + + $PROJ_DIR$\rt-thread\components\finsh\cmd.c + + + $PROJ_DIR$\rt-thread\components\finsh\msh.c + + + + Kernel + + $PROJ_DIR$\rt-thread\src\clock.c + + + $PROJ_DIR$\rt-thread\src\components.c + + + $PROJ_DIR$\rt-thread\src\device.c + + + $PROJ_DIR$\rt-thread\src\idle.c + + + $PROJ_DIR$\rt-thread\src\ipc.c + + + $PROJ_DIR$\rt-thread\src\irq.c + + + $PROJ_DIR$\rt-thread\src\kservice.c + + + $PROJ_DIR$\rt-thread\src\mem.c + + + $PROJ_DIR$\rt-thread\src\mempool.c + + + $PROJ_DIR$\rt-thread\src\object.c + + + $PROJ_DIR$\rt-thread\src\scheduler.c + + + $PROJ_DIR$\rt-thread\src\signal.c + + + $PROJ_DIR$\rt-thread\src\thread.c + + + $PROJ_DIR$\rt-thread\src\timer.c + + + + libc + + $PROJ_DIR$\rt-thread\components\libc\compilers\common\time.c + + + + STM32_HAL + + $PROJ_DIR$\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cec.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_comp.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc_ex.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cryp.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cryp_ex.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rng.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sram.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_usart.c + + + $PROJ_DIR$\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c + + + diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/project.eww b/bsp/stm32/stm32h750-fk750m1-vbt6/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/project.uvoptx b/bsp/stm32/stm32h750-fk750m1-vbt6/project.uvoptx new file mode 100644 index 0000000000..7ac05c0c59 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/project.uvoptx @@ -0,0 +1,1384 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 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 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + JL2CM3 + -U59700618 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(6BA02477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO11 -FD20000000 -FC8000 -FN1 -FF0STM32H750VB_W25Qxx_WeActStudio -FS090000000 -FL01000000 + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC8000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743IIKx$CMSIS\Flash\STM32H7x_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 + + + + + Compiler + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdio.c + cstdio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 3 + 12 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m7\context_rvds.S + context_rvds.S + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m7\cpu_cache.c + cpu_cache.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m7\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\i2c\i2c-bit-ops.c + i2c-bit-ops.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\i2c\i2c_core.c + i2c_core.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\i2c\i2c_dev.c + i2c_dev.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion.c + completion.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\rtc\rtc.c + rtc.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial_v2.c + serial_v2.c + 0 + 0 + + + 4 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\spi\qspi_core.c + qspi_core.c + 0 + 0 + + + 4 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\spi\sfud\src\sfud.c + sfud.c + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\spi\sfud\src\sfud_sfdp.c + sfud_sfdp.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\spi\spi_core.c + spi_core.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\spi\spi_dev.c + spi_dev.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\spi\spi_flash_sfud.c + spi_flash_sfud.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 5 + 34 + 2 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Source\Templates\arm\startup_stm32h750xx.s + startup_stm32h750xx.s + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32h7xx_hal_msp.c + stm32h7xx_hal_msp.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 5 + 37 + 1 + 0 + 0 + 0 + board\port\lcd\drv_lcd_spi.c + drv_lcd_spi.c + 0 + 0 + + + 5 + 38 + 1 + 0 + 0 + 0 + board\port\lcd\drv_lcd_spi_ext.c + drv_lcd_spi_ext.c + 0 + 0 + + + 5 + 39 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + 5 + 40 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 41 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_qspi.c + drv_qspi.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart_v2.c + drv_usart_v2.c + 0 + 0 + + + + + Filesystem + 0 + 0 + 0 + 0 + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\components\dfs\filesystems\devfs\devfs.c + devfs.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\components\dfs\src\dfs.c + dfs.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\components\dfs\src\dfs_file.c + dfs_file.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\components\dfs\src\dfs_fs.c + dfs_fs.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\components\dfs\src\dfs_posix.c + dfs_posix.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_file.c + msh_file.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 8 + 54 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 8 + 55 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 8 + 56 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 8 + 57 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 8 + 58 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 8 + 59 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 8 + 60 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 8 + 61 + 1 + 0 + 0 + 0 + ..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 8 + 62 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 8 + 63 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 8 + 64 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 8 + 65 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 8 + 66 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 9 + 67 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c + stm32h7xx_hal_rcc.c + 0 + 0 + + + 9 + 68 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_spi.c + stm32h7xx_hal_spi.c + 0 + 0 + + + 9 + 69 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c + stm32h7xx_hal_pwr.c + 0 + 0 + + + 9 + 70 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c + stm32h7xx_hal_rcc_ex.c + 0 + 0 + + + 9 + 71 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sram.c + stm32h7xx_hal_sram.c + 0 + 0 + + + 9 + 72 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rtc.c + stm32h7xx_hal_rtc.c + 0 + 0 + + + 9 + 73 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c + stm32h7xx_hal_cortex.c + 0 + 0 + + + 9 + 74 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c + stm32h7xx_hal_i2c_ex.c + 0 + 0 + + + 9 + 75 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cryp_ex.c + stm32h7xx_hal_cryp_ex.c + 0 + 0 + + + 9 + 76 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c + stm32h7xx_hal_dma_ex.c + 0 + 0 + + + 9 + 77 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rtc_ex.c + stm32h7xx_hal_rtc_ex.c + 0 + 0 + + + 9 + 78 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c + stm32h7xx_hal_i2c.c + 0 + 0 + + + 9 + 79 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cryp.c + stm32h7xx_hal_cryp.c + 0 + 0 + + + 9 + 80 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_usart.c + stm32h7xx_hal_usart.c + 0 + 0 + + + 9 + 81 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc_ex.c + stm32h7xx_hal_crc_ex.c + 0 + 0 + + + 9 + 82 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c + stm32h7xx_hal_gpio.c + 0 + 0 + + + 9 + 83 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c + stm32h7xx_hal_uart_ex.c + 0 + 0 + + + 9 + 84 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c + stm32h7xx_hal_mdma.c + 0 + 0 + + + 9 + 85 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c + stm32h7xx_hal.c + 0 + 0 + + + 9 + 86 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c + stm32h7xx_hal_dma.c + 0 + 0 + + + 9 + 87 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c + stm32h7xx_hal_uart.c + 0 + 0 + + + 9 + 88 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_comp.c + stm32h7xx_hal_comp.c + 0 + 0 + + + 9 + 89 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rng.c + stm32h7xx_hal_rng.c + 0 + 0 + + + 9 + 90 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc.c + stm32h7xx_hal_crc.c + 0 + 0 + + + 9 + 91 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cec.c + stm32h7xx_hal_cec.c + 0 + 0 + + + 9 + 92 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_qspi.c + stm32h7xx_hal_qspi.c + 0 + 0 + + + 9 + 93 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c + stm32h7xx_hal_pwr_ex.c + 0 + 0 + + + 9 + 94 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c + system_stm32h7xx.c + 0 + 0 + + + + diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/project.uvprojx b/bsp/stm32/stm32h750-fk750m1-vbt6/project.uvprojx new file mode 100644 index 0000000000..ea6f3583ea --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/project.uvprojx @@ -0,0 +1,1876 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + STM32H750VBTx + STMicroelectronics + Keil.STM32H7xx_DFP.3.0.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00100000) IROM2(0x08100000,0x00100000) XRAM(0x30000000,0x00048000) XRAM2(0x38000000,0x00010000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H750VBTx$CMSIS\Flash\STM32H7x_2048.FLM)) + 0 + $$Device:STM32H750VBTx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h + + + + + + + + + + $$Device:STM32H750VBTx$CMSIS\SVD\STM32H743x.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\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 + 1 + 0 + 3 + 0 + 1 + 1 + 8 + 1 + 0 + 0 + 0 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x30000000 + 0x48000 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x8100000 + 0x100000 + + + 0 + 0x30000000 + 0x48000 + + + 0 + 0x38000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x24000000 + 0x80000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + + + __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, STM32H750xx, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, USE_HAL_DRIVER + + ..\libraries\HAL_Drivers\config;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\include;board\port;..\..\..\components\dfs\include;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\include;board\CubeMX_Config\Inc;.;..\..\..\components\drivers\spi\sfud\inc;..\libraries\HAL_Drivers\CMSIS\Include;..\..\..\components\libc\posix\io\stdio;..\..\..\include;board;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\libcpu\arm\cortex-m7;..\..\..\components\dfs\filesystems\devfs;..\..\..\libcpu\arm\common;..\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Include;..\..\..\components\libc\posix\io\poll;..\..\..\components\drivers\include;..\..\..\components\finsh;..\..\..\components\drivers\spi;..\..\..\components\libc\compilers\common\extension;..\..\..\components\drivers\include;..\libraries\HAL_Drivers;..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Inc;..\..\..\components\drivers\include;board\port\lcd;applications + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + syscalls.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + + + cctype.c + 1 + ..\..\..\components\libc\compilers\common\cctype.c + + + cstdio.c + 1 + ..\..\..\components\libc\compilers\common\cstdio.c + + + cstdlib.c + 1 + ..\..\..\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\..\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\..\components\libc\compilers\common\ctime.c + + + cwchar.c + 1 + ..\..\..\components\libc\compilers\common\cwchar.c + + + + + CPU + + + 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 + + + i2c-bit-ops.c + 1 + ..\..\..\components\drivers\i2c\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 + + --c99 + + + + + + + + + + i2c_core.c + 1 + ..\..\..\components\drivers\i2c\i2c_core.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + --c99 + + + + + + + + + + i2c_dev.c + 1 + ..\..\..\components\drivers\i2c\i2c_dev.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + --c99 + + + + + + + + + + completion.c + 1 + ..\..\..\components\drivers\ipc\completion.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 + + + + + + + + + + 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 + + --c99 + + + + + + + + + + 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 + + --c99 + + + + + + + + + + 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 + + --c99 + + + + + + + + + + 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 + + --c99 + + + + + + + + + + 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 + + --c99 + + + + + + + + + + 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 + + --c99 + + + + + + + + + + pin.c + 1 + ..\..\..\components\drivers\misc\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 + + --c99 + + + + + + + + + + rtc.c + 1 + ..\..\..\components\drivers\rtc\rtc.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 + + + + + + + + + + serial_v2.c + 1 + ..\..\..\components\drivers\serial\serial_v2.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 + + + + + + + + + + qspi_core.c + 1 + ..\..\..\components\drivers\spi\qspi_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 + + + + + + + + + + sfud.c + 1 + ..\..\..\components\drivers\spi\sfud\src\sfud.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 + + + + + + + + + + sfud_sfdp.c + 1 + ..\..\..\components\drivers\spi\sfud\src\sfud_sfdp.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 + + + + + + + + + + spi_core.c + 1 + ..\..\..\components\drivers\spi\spi_core.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + --c99 + + + + + + + + + + spi_dev.c + 1 + ..\..\..\components\drivers\spi\spi_dev.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + --c99 + + + + + + + + + + spi_flash_sfud.c + 1 + ..\..\..\components\drivers\spi\spi_flash_sfud.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 + + + + + + + + + + + + Drivers + + + startup_stm32h750xx.s + 2 + ..\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Source\Templates\arm\startup_stm32h750xx.s + + + stm32h7xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32h7xx_hal_msp.c + + + board.c + 1 + board\board.c + + + drv_lcd_spi.c + 1 + board\port\lcd\drv_lcd_spi.c + + + drv_lcd_spi_ext.c + 1 + board\port\lcd\drv_lcd_spi_ext.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_qspi.c + 1 + ..\libraries\HAL_Drivers\drv_qspi.c + + + drv_spi.c + 1 + ..\libraries\HAL_Drivers\drv_spi.c + + + drv_usart_v2.c + 1 + ..\libraries\HAL_Drivers\drv_usart_v2.c + + + + + Filesystem + + + devfs.c + 1 + ..\..\..\components\dfs\filesystems\devfs\devfs.c + + + dfs.c + 1 + ..\..\..\components\dfs\src\dfs.c + + + dfs_file.c + 1 + ..\..\..\components\dfs\src\dfs_file.c + + + dfs_fs.c + 1 + ..\..\..\components\dfs\src\dfs_fs.c + + + dfs_posix.c + 1 + ..\..\..\components\dfs\src\dfs_posix.c + + + + + Finsh + + + 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 + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + memheap.c + 1 + ..\..\..\src\memheap.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Libraries + + + stm32h7xx_hal_rcc.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c + + + stm32h7xx_hal_spi.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_spi.c + + + stm32h7xx_hal_pwr.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c + + + stm32h7xx_hal_rcc_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c + + + stm32h7xx_hal_sram.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sram.c + + + stm32h7xx_hal_rtc.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rtc.c + + + stm32h7xx_hal_cortex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c + + + stm32h7xx_hal_i2c_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c + + + stm32h7xx_hal_cryp_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cryp_ex.c + + + stm32h7xx_hal_dma_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c + + + stm32h7xx_hal_rtc_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rtc_ex.c + + + stm32h7xx_hal_i2c.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c + + + stm32h7xx_hal_cryp.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cryp.c + + + stm32h7xx_hal_usart.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_usart.c + + + stm32h7xx_hal_crc_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc_ex.c + + + stm32h7xx_hal_gpio.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c + + + stm32h7xx_hal_uart_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c + + + stm32h7xx_hal_mdma.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c + + + stm32h7xx_hal.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c + + + stm32h7xx_hal_dma.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c + + + stm32h7xx_hal_uart.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c + + + stm32h7xx_hal_comp.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_comp.c + + + stm32h7xx_hal_rng.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rng.c + + + stm32h7xx_hal_crc.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc.c + + + stm32h7xx_hal_cec.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cec.c + + + stm32h7xx_hal_qspi.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_qspi.c + + + stm32h7xx_hal_pwr_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c + + + system_stm32h7xx.c + 1 + ..\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c + + + + + + + + + + + + + +
diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.h b/bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.h new file mode 100644 index 0000000000..c9efa3d2ac --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.h @@ -0,0 +1,264 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 8 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_HOOK_USING_FUNC_PTR +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 + +/* kservice optimization */ + +#define RT_KSERVICE_USING_STDLIB +#define RT_DEBUG +#define RT_DEBUG_COLOR + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_PAGE_MAX_ORDER 11 +#define RT_USING_MEMPOOL +#define RT_USING_MEMHEAP +#define RT_MEMHEAP_FAST_MODE +#define RT_USING_MEMHEAP_AS_HEAP +#define RT_USING_MEMHEAP_AUTO_BINDING +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x50000 +#define RT_USING_CACHE +#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 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 RT_USING_DFS +#define DFS_USING_POSIX +#define DFS_USING_WORKDIR +#define DFS_FILESYSTEMS_MAX 4 +#define DFS_FILESYSTEM_TYPES_MAX 4 +#define DFS_FD_MAX 16 +#define RT_USING_DFS_DEVFS + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V2 +#define RT_SERIAL_USING_DMA +#define RT_USING_I2C +#define RT_USING_I2C_BITOPS +#define RT_USING_PIN +#define RT_USING_RTC +#define RT_USING_SPI +#define RT_USING_QSPI +#define RT_USING_SFUD +#define RT_SFUD_USING_SFDP +#define RT_SFUD_USING_FLASH_INFO_TABLE +#define RT_SFUD_USING_QSPI +#define RT_SFUD_SPI_MAX_HZ 10000000 + +/* Using USB */ + + +/* C/C++ and POSIX layer */ + +#define RT_LIBC_DEFAULT_TIMEZONE 8 + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + + +/* Network */ + + +/* Utilities */ + + +/* RT-Thread Utestcases */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + + +/* XML: Extensible Markup Language */ + + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + + +/* u8g2: a monochrome graphic library */ + + +/* tools packages */ + + +/* system packages */ + +/* enhanced kernel services */ + + +/* acceleration: Assembly language or algorithmic acceleration packages */ + + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + + +/* Micrium: Micrium software products porting for RT-Thread */ + + +/* peripheral libraries and drivers */ + +/* sensors drivers */ + + +/* touch drivers */ + + +/* Kendryte SDK */ + + +/* AI packages */ + + +/* Signal Processing and Control Algorithm Packages */ + + +/* miscellaneous packages */ + +/* project laboratory */ + +/* samples: kernel and components samples */ + + +/* entertainment: terminal games and other interesting software packages */ + + +/* Arduino libraries */ + + +/* Projects */ + + +/* Sensors */ + + +/* Display */ + + +/* Timing */ + + +/* Data Processing */ + + +/* Data Storage */ + +/* Communication */ + + +/* Device Control */ + + +/* Other */ + + +/* Signal IO */ + + +/* Uncategorized */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32H7 + +/* Hardware Drivers Config */ + +#define SOC_STM32H750VBT6 + +/* Onboard Peripheral Drivers */ + +#define BSP_USING_LCD_SPI + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART1 +#define BSP_USING_SPI +#define BSP_USING_SPI4 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.py b/bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.py new file mode 100644 index 0000000000..c826e54dab --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/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'/opt/gcc-arm-none-eabi/bin/' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'D:/Keil/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/stm32/stm32h750-fk750m1-vbt6/template.ewp b/bsp/stm32/stm32h750-fk750m1-vbt6/template.ewp new file mode 100644 index 0000000000..3916c06799 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/template.ewp @@ -0,0 +1,2074 @@ + + + 3 + + rtthread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/template.eww b/bsp/stm32/stm32h750-fk750m1-vbt6/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/template.uvoptx b/bsp/stm32/stm32h750-fk750m1-vbt6/template.uvoptx new file mode 100644 index 0000000000..4944c63d59 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/template.uvoptx @@ -0,0 +1,184 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 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 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + JL2CM3 + -U59700618 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(6BA02477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO11 -FD20000000 -FC8000 -FN1 -FF0STM32H750VB_W25Qxx_WeActStudio -FS090000000 -FL01000000 + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC8000 -FD20000000 -FF0STM32H7x_2048 -FL0200000 -FS08000000 -FP0($$Device:STM32H743IIKx$CMSIS\Flash\STM32H7x_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 + + + + +
diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/template.uvprojx b/bsp/stm32/stm32h750-fk750m1-vbt6/template.uvprojx new file mode 100644 index 0000000000..7af46550b9 --- /dev/null +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/template.uvprojx @@ -0,0 +1,390 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + STM32H750VBTx + STMicroelectronics + Keil.STM32H7xx_DFP.3.0.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00080000) IROM(0x08000000,0x00100000) IROM2(0x08100000,0x00100000) XRAM(0x30000000,0x00048000) XRAM2(0x38000000,0x00010000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0STM32H7x_2048 -FS08000000 -FL0200000 -FP0($$Device:STM32H750VBTx$CMSIS\Flash\STM32H7x_2048.FLM)) + 0 + $$Device:STM32H750VBTx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h + + + + + + + + + + $$Device:STM32H750VBTx$CMSIS\SVD\STM32H743x.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\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 + 1 + 0 + 3 + 0 + 1 + 1 + 8 + 1 + 0 + 0 + 0 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x30000000 + 0x48000 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x8100000 + 0x100000 + + + 0 + 0x30000000 + 0x48000 + + + 0 + 0x38000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x24000000 + 0x80000 + + + + + + 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 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + + + + + + + +