forth commit

This commit is contained in:
ZhangJinLong 2025-10-09 10:39:54 +08:00
parent b04950de34
commit a182e5b445
34 changed files with 9074 additions and 8829 deletions

View File

@ -1 +1 @@
2480e295a6720eac43ef0ee8cc58eb9d C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin 8db25164baff9d11fbda8915269073f0 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1 +1 @@
aa5edb1e1d1e2c9228e9ebe7a2633a8ec50ab3b3 b04950de3478f58570bf2e7e2f85273adfc37c64

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -134,3 +134,21 @@
52 297 7807323764513411 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec 52 297 7807323764513411 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
32 271 7808122893643811 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec 32 271 7808122893643811 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
32 271 7808122893643811 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec 32 271 7808122893643811 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
33 209 7808132488421283 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
33 209 7808132488421283 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
48 238 7808132799029488 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
48 238 7808132799029488 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
33 225 7808133283792983 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
33 225 7808133283792983 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
41 354 7808135622806769 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
41 354 7808135622806769 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
35 255 7808136632774511 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
35 255 7808136632774511 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
35 250 7808138741277525 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
35 250 7808138741277525 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
41 461 7808150085391160 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
41 461 7808150085391160 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
32 249 7808152929417164 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
32 249 7808152929417164 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
42 197 7808264008636333 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
42 197 7808264008636333 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec

View File

@ -3238,7 +3238,7 @@ build esp-idf/partition_table/CMakeFiles/partition_table-flash | ${cmake_ninja_w
build cmake_object_order_depends_target___idf_esp_app_format: phony || cmake_object_order_depends_target___idf_esp_bootloader_format build cmake_object_order_depends_target___idf_esp_app_format: phony || cmake_object_order_depends_target___idf_esp_bootloader_format
build esp-idf/esp_app_format/CMakeFiles/__idf_esp_app_format.dir/esp_app_desc.c.obj: C_COMPILER____idf_esp_app_format_unscanned_ C$:/Espressif/frameworks/esp-idf-v5.5/components/esp_app_format/esp_app_desc.c || cmake_object_order_depends_target___idf_esp_app_format build esp-idf/esp_app_format/CMakeFiles/__idf_esp_app_format.dir/esp_app_desc.c.obj: C_COMPILER____idf_esp_app_format_unscanned_ C$:/Espressif/frameworks/esp-idf-v5.5/components/esp_app_format/esp_app_desc.c || cmake_object_order_depends_target___idf_esp_app_format
DEFINES = -DESP_PLATFORM -DIDF_VER=\"v5.5\" -DSOC_MMU_PAGE_SIZE=CONFIG_MMU_PAGE_SIZE -DSOC_XTAL_FREQ_MHZ=CONFIG_XTAL_FREQ -D_GLIBCXX_HAVE_POSIX_SEMAPHORE -D_GLIBCXX_USE_POSIX_SEMAPHORE -D_GNU_SOURCE -D_POSIX_READER_WRITER_LOCKS -D PROJECT_NAME=\"SIM_S3_1\" -DPROJECT_VER=\"aa5edb1-dirty\" DEFINES = -DESP_PLATFORM -DIDF_VER=\"v5.5\" -DSOC_MMU_PAGE_SIZE=CONFIG_MMU_PAGE_SIZE -DSOC_XTAL_FREQ_MHZ=CONFIG_XTAL_FREQ -D_GLIBCXX_HAVE_POSIX_SEMAPHORE -D_GLIBCXX_USE_POSIX_SEMAPHORE -D_GNU_SOURCE -D_POSIX_READER_WRITER_LOCKS -D PROJECT_NAME=\"SIM_S3_1\" -DPROJECT_VER=\"b04950d-dirty\"
DEP_FILE = esp-idf\esp_app_format\CMakeFiles\__idf_esp_app_format.dir\esp_app_desc.c.obj.d DEP_FILE = esp-idf\esp_app_format\CMakeFiles\__idf_esp_app_format.dir\esp_app_desc.c.obj.d
FLAGS = -mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -fdiagnostics-color=always -ffunction-sections -fdata-sections -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=unused-but-set-variable -Wno-error=deprecated-declarations -Wextra -Wno-error=extra -Wno-unused-parameter -Wno-sign-compare -Wno-enum-conversion -gdwarf-4 -ggdb -mdisable-hardware-atomics -Og -fno-shrink-wrap -fmacro-prefix-map=C:/Users/29096/Desktop/work/SIM/SIM_S3_1=. -fmacro-prefix-map=C:/Espressif/frameworks/esp-idf-v5.5=/IDF -fstrict-volatile-bitfields -fno-jump-tables -fno-tree-switch-conversion -std=gnu17 -Wno-old-style-declaration FLAGS = -mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -fdiagnostics-color=always -ffunction-sections -fdata-sections -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=unused-but-set-variable -Wno-error=deprecated-declarations -Wextra -Wno-error=extra -Wno-unused-parameter -Wno-sign-compare -Wno-enum-conversion -gdwarf-4 -ggdb -mdisable-hardware-atomics -Og -fno-shrink-wrap -fmacro-prefix-map=C:/Users/29096/Desktop/work/SIM/SIM_S3_1=. -fmacro-prefix-map=C:/Espressif/frameworks/esp-idf-v5.5=/IDF -fstrict-volatile-bitfields -fno-jump-tables -fno-tree-switch-conversion -std=gnu17 -Wno-old-style-declaration
INCLUDES = -IC:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/config -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_app_format/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/newlib/platform_include -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/config/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/config/include/freertos -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/config/xtensa/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/FreeRTOS-Kernel/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/FreeRTOS-Kernel/portable/xtensa/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/FreeRTOS-Kernel/portable/xtensa/include/freertos -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/esp_additions/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/include/soc -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/include/soc/esp32s3 -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/dma/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/ldo/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/debug_probe/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/mspi_timing_tuning/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/mspi_timing_tuning/tuning_scheme_impl/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/power_supply/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/port/esp32s3/. -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/port/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/mspi_timing_tuning/port/esp32s3/. -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/mspi_timing_tuning/port/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/heap/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/heap/tlsf -IC:/Espressif/frameworks/esp-idf-v5.5/components/log/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/soc/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/soc/esp32s3 -IC:/Espressif/frameworks/esp-idf-v5.5/components/soc/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/soc/esp32s3/register -IC:/Espressif/frameworks/esp-idf-v5.5/components/hal/platform_port/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/hal/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/hal/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_rom/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_rom/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_rom/esp32s3/include/esp32s3 -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_rom/esp32s3 -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_common/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_system/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_system/port/soc -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_system/port/include/private -IC:/Espressif/frameworks/esp-idf-v5.5/components/xtensa/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/xtensa/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/xtensa/deprecated_include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/include/apps -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/include/apps/sntp -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/lwip/src/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/port/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/port/freertos/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/port/esp32xx/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/port/esp32xx/include/arch -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/port/esp32xx/include/sys INCLUDES = -IC:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/config -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_app_format/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/newlib/platform_include -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/config/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/config/include/freertos -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/config/xtensa/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/FreeRTOS-Kernel/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/FreeRTOS-Kernel/portable/xtensa/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/FreeRTOS-Kernel/portable/xtensa/include/freertos -IC:/Espressif/frameworks/esp-idf-v5.5/components/freertos/esp_additions/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/include/soc -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/include/soc/esp32s3 -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/dma/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/ldo/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/debug_probe/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/mspi_timing_tuning/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/mspi_timing_tuning/tuning_scheme_impl/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/power_supply/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/port/esp32s3/. -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/port/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/mspi_timing_tuning/port/esp32s3/. -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_hw_support/mspi_timing_tuning/port/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/heap/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/heap/tlsf -IC:/Espressif/frameworks/esp-idf-v5.5/components/log/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/soc/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/soc/esp32s3 -IC:/Espressif/frameworks/esp-idf-v5.5/components/soc/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/soc/esp32s3/register -IC:/Espressif/frameworks/esp-idf-v5.5/components/hal/platform_port/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/hal/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/hal/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_rom/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_rom/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_rom/esp32s3/include/esp32s3 -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_rom/esp32s3 -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_common/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_system/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_system/port/soc -IC:/Espressif/frameworks/esp-idf-v5.5/components/esp_system/port/include/private -IC:/Espressif/frameworks/esp-idf-v5.5/components/xtensa/esp32s3/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/xtensa/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/xtensa/deprecated_include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/include/apps -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/include/apps/sntp -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/lwip/src/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/port/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/port/freertos/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/port/esp32xx/include -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/port/esp32xx/include/arch -IC:/Espressif/frameworks/esp-idf-v5.5/components/lwip/port/esp32xx/include/sys

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -0,0 +1,8 @@
Command: ninja flash
CMake Error at run_serial_tool.cmake:67 (message):
C:/Espressif/python_env/idf5.5_py3.11_env/Scripts/python.exe;;C:/Espressif/frameworks/esp-idf-v5.5/components/esptool_py/esptool/esptool.py;--chip;esp32s3
failed.

View File

@ -0,0 +1 @@
Command: ninja all

View File

@ -0,0 +1 @@
Command: ninja all

View File

@ -0,0 +1 @@
Command: ninja all

View File

@ -0,0 +1 @@
Command: ninja all

View File

@ -0,0 +1 @@
Command: ninja flash

View File

@ -0,0 +1,55 @@
Command: ninja flash
[1/10] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/main.c.obj
[2/10] Performing build step for 'bootloader'
[1/1] C:\Windows\system32\cmd.exe /C "cd /D C:\Users\29096\Desktop\work\SIM\SIM_S3_1\build\bootloader\esp-idf\esptool_py && C:\Espressif\python_env\idf5.5_py3.11_env\Scripts\python.exe C:/Espressif/frameworks/esp-idf-v5.5/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/bootloader.bin"
Bootloader binary size 0x5260 bytes. 0x2da0 bytes (36%) free.
[3/10] No install step for 'bootloader'
[4/10] Linking C static library esp-idf\main\libmain.a
[5/10] Completed 'bootloader'
[6/10] Generating esp-idf/esp_system/ld/sections.ld
[7/10] Linking CXX executable SIM_S3_1.elf
[8/10] Generating binary image from built executable
esptool.py v4.9.1
Creating esp32s3 image...
Merged 2 ELF sections
Successfully created esp32s3 image.
Generated C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin
[9/10] C:\Windows\system32\cmd.exe /C "cd /D C:\Users\29096\Desktop\work\SIM\SIM_S3_1\build\esp-idf\esptool_py && C:\Espressif\python_env\idf5.5_py3.11_env\Scripts\python.exe C:/Espressif/frameworks/esp-idf-v5.5/components/partition_table/check_sizes.py --offset 0x8000 partition --type app C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/partition_table/partition-table.bin C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin"
SIM_S3_1.bin binary size 0x49280 bytes. Smallest app partition is 0x300000 bytes. 0x2b6d80 bytes (90%) free.
[9/10] C:\Windows\system32\cmd.exe /C "cd /D C:\Espressif\frameworks\esp-idf-v5.5\components\esptool_py && C:\Espressif\tools\cmake\3.30.2\bin\cmake.exe -D IDF_PATH=C:/Espressif/frameworks/esp-idf-v5.5 -D SERIAL_TOOL=C:/Espressif/python_env/idf5.5_py3.11_env/Scripts/python.exe;;C:/Espressif/frameworks/esp-idf-v5.5/components/esptool_py/esptool/esptool.py;--chip;esp32s3 -D SERIAL_TOOL_ARGS=--before=default_reset;--after=hard_reset;write_flash;@flash_args -D WORKING_DIRECTORY=C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build -P C:/Espressif/frameworks/esp-idf-v5.5/components/esptool_py/run_serial_tool.cmake"
esptool.py --chip esp32s3 -p COM16 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 80m --flash_size 8MB 0x0 bootloader/bootloader.bin 0x10000 SIM_S3_1.bin 0x8000 partition_table/partition-table.bin
esptool.py v4.9.1
Serial port COM16
Connecting....
Chip is ESP32-S3 (QFN56) (revision v0.2)
Features: WiFi, BLE, Embedded PSRAM 8MB (AP_3v3)
Crystal is 40MHz
MAC: 64:e8:33:4c:69:b4
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00005fff...
Flash will be erased from 0x00010000 to 0x00059fff...
Flash will be erased from 0x00008000 to 0x00008fff...
SHA digest in image updated
Compressed 21088 bytes to 13420...
Writing at 0x00000000... (100 %)
Wrote 21088 bytes (13420 compressed) at 0x00000000 in 0.7 seconds (effective 237.6 kbit/s)...
Hash of data verified.
Compressed 299648 bytes to 156543...
Writing at 0x00010000... (10 %)
Writing at 0x0001cda8... (20 %)
Writing at 0x000244cc... (30 %)
Writing at 0x0002aea9... (40 %)
Lost connection, retrying...
Waiting for the chip to reconnect.......
A serial exception error occurred: Cannot configure port, something went wrong. Original message: OSError(22, '指定不存在的设备。', None, 433)
Note: This error originates from pySerial. It is likely not a problem with esptool, but with the hardware connection or drivers.
For troubleshooting steps visit: https://docs.espressif.com/projects/esptool/en/latest/troubleshooting.html
FAILED: CMakeFiles/flash C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/CMakeFiles/flash
C:\Windows\system32\cmd.exe /C "cd /D C:\Espressif\frameworks\esp-idf-v5.5\components\esptool_py && C:\Espressif\tools\cmake\3.30.2\bin\cmake.exe -D IDF_PATH=C:/Espressif/frameworks/esp-idf-v5.5 -D SERIAL_TOOL=C:/Espressif/python_env/idf5.5_py3.11_env/Scripts/python.exe;;C:/Espressif/frameworks/esp-idf-v5.5/components/esptool_py/esptool/esptool.py;--chip;esp32s3 -D SERIAL_TOOL_ARGS=--before=default_reset;--after=hard_reset;write_flash;@flash_args -D WORKING_DIRECTORY=C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build -P C:/Espressif/frameworks/esp-idf-v5.5/components/esptool_py/run_serial_tool.cmake"
ninja: build stopped: subcommand failed.

View File

@ -0,0 +1,18 @@
Command: ninja all
[1/9] Performing build step for 'bootloader'
[1/1] C:\Windows\system32\cmd.exe /C "cd /D C:\Users\29096\Desktop\work\SIM\SIM_S3_1\build\bootloader\esp-idf\esptool_py && C:\Espressif\python_env\idf5.5_py3.11_env\Scripts\python.exe C:/Espressif/frameworks/esp-idf-v5.5/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/bootloader.bin"
Bootloader binary size 0x5260 bytes. 0x2da0 bytes (36%) free.
[2/9] No install step for 'bootloader'
[3/9] Completed 'bootloader'
[4/9] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/main.c.obj
[5/9] Linking C static library esp-idf\main\libmain.a
[6/9] Generating esp-idf/esp_system/ld/sections.ld
[7/9] Linking CXX executable SIM_S3_1.elf
[8/9] Generating binary image from built executable
esptool.py v4.9.1
Creating esp32s3 image...
Merged 2 ELF sections
Successfully created esp32s3 image.
Generated C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin
[9/9] C:\Windows\system32\cmd.exe /C "cd /D C:\Users\29096\Desktop\work\SIM\SIM_S3_1\build\esp-idf\esptool_py && C:\Espressif\python_env\idf5.5_py3.11_env\Scripts\python.exe C:/Espressif/frameworks/esp-idf-v5.5/components/partition_table/check_sizes.py --offset 0x8000 partition --type app C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/partition_table/partition-table.bin C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin"
SIM_S3_1.bin binary size 0x49280 bytes. Smallest app partition is 0x300000 bytes. 0x2b6d80 bytes (90%) free.

View File

@ -0,0 +1,18 @@
Command: ninja all
[1/9] Performing build step for 'bootloader'
[1/1] C:\Windows\system32\cmd.exe /C "cd /D C:\Users\29096\Desktop\work\SIM\SIM_S3_1\build\bootloader\esp-idf\esptool_py && C:\Espressif\python_env\idf5.5_py3.11_env\Scripts\python.exe C:/Espressif/frameworks/esp-idf-v5.5/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/bootloader.bin"
Bootloader binary size 0x5260 bytes. 0x2da0 bytes (36%) free.
[2/9] No install step for 'bootloader'
[3/9] Completed 'bootloader'
[4/9] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/main.c.obj
[5/9] Linking C static library esp-idf\main\libmain.a
[6/9] Generating esp-idf/esp_system/ld/sections.ld
[7/9] Linking CXX executable SIM_S3_1.elf
[8/9] Generating binary image from built executable
esptool.py v4.9.1
Creating esp32s3 image...
Merged 2 ELF sections
Successfully created esp32s3 image.
Generated C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin
[9/9] C:\Windows\system32\cmd.exe /C "cd /D C:\Users\29096\Desktop\work\SIM\SIM_S3_1\build\esp-idf\esptool_py && C:\Espressif\python_env\idf5.5_py3.11_env\Scripts\python.exe C:/Espressif/frameworks/esp-idf-v5.5/components/partition_table/check_sizes.py --offset 0x8000 partition --type app C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/partition_table/partition-table.bin C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin"
SIM_S3_1.bin binary size 0x49280 bytes. Smallest app partition is 0x300000 bytes. 0x2b6d80 bytes (90%) free.

View File

@ -0,0 +1,28 @@
Command: ninja all
[1/11] Performing build step for 'bootloader'
[1/1] C:\Windows\system32\cmd.exe /C "cd /D C:\Users\29096\Desktop\work\SIM\SIM_S3_1\build\bootloader\esp-idf\esptool_py && C:\Espressif\python_env\idf5.5_py3.11_env\Scripts\python.exe C:/Espressif/frameworks/esp-idf-v5.5/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/bootloader.bin"
Bootloader binary size 0x5260 bytes. 0x2da0 bytes (36%) free.
[2/11] No install step for 'bootloader'
[3/11] Completed 'bootloader'
[4/11] Building C object esp-idf/signal_generators/CMakeFiles/__idf_signal_generators.dir/src/ecg_generator.c.obj
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/components/signal_generators/src/ecg_generator.c: In function 'ecg_generator_output_twelve_leads':
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/components/signal_generators/src/ecg_generator.c:449:28: warning: unused variable 'g_ecg_gen_iii' [-Wunused-variable]
449 | g_ecg_gen_iii;
| ^~~~~~~~~~~~~
[5/11] Linking C static library esp-idf\signal_generators\libsignal_generators.a
[6/11] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/main.c.obj
[7/11] Linking C static library esp-idf\main\libmain.a
[8/11] Generating esp-idf/esp_system/ld/sections.ld
[9/11] Linking CXX executable SIM_S3_1.elf
FAILED: SIM_S3_1.elf
C:\Windows\system32\cmd.exe /C "cd . && C:\Espressif\tools\xtensa-esp-elf\esp-14.2.0_20241119\xtensa-esp-elf\bin\xtensa-esp32s3-elf-g++.exe -mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -nostartfiles -Wl,--cref -Wl,--defsym=IDF_TARGET_ESP32S3=0 -Wl,--Map=C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.map -Wl,--no-warn-rwx-segments -fno-rtti -fno-lto -Wl,--gc-sections -Wl,--warn-common -T esp32s3.peripherals.ld -T esp32s3.rom.ld -T esp32s3.rom.api.ld -T esp32s3.rom.bt_funcs.ld -T esp32s3.rom.libgcc.ld -T esp32s3.rom.wdt.ld -T esp32s3.rom.version.ld -T esp32s3.rom.ble_cca.ld -T esp32s3.rom.ble_test.ld -T esp32s3.rom.libc.ld -T esp32s3.rom.newlib.ld -T memory.ld -T sections.ld @CMakeFiles\SIM_S3_1.elf.rsp -o SIM_S3_1.elf && cd ."
C:/Espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/signal_generators/libsignal_generators.a(ecg_generator.c.obj):(.literal.ecg_generator_output_twelve_leads+0x0): undefined reference to `g_ecg_gen_i'
C:/Espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/signal_generators/libsignal_generators.a(ecg_generator.c.obj):(.literal.ecg_generator_output_twelve_leads+0x4): undefined reference to `g_ecg_gen_ii'
C:/Espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/signal_generators/libsignal_generators.a(ecg_generator.c.obj):(.literal.ecg_generator_output_twelve_leads+0x8): undefined reference to `g_ecg_gen_v1'
C:/Espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/signal_generators/libsignal_generators.a(ecg_generator.c.obj):(.literal.ecg_generator_output_twelve_leads+0xc): undefined reference to `g_ecg_gen_v2'
C:/Espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/signal_generators/libsignal_generators.a(ecg_generator.c.obj):(.literal.ecg_generator_output_twelve_leads+0x10): undefined reference to `g_ecg_gen_v3'
C:/Espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/signal_generators/libsignal_generators.a(ecg_generator.c.obj):(.literal.ecg_generator_output_twelve_leads+0x14): undefined reference to `g_ecg_gen_v4'
C:/Espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/signal_generators/libsignal_generators.a(ecg_generator.c.obj):(.literal.ecg_generator_output_twelve_leads+0x18): undefined reference to `g_ecg_gen_v5'
C:/Espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/signal_generators/libsignal_generators.a(ecg_generator.c.obj):(.literal.ecg_generator_output_twelve_leads+0x1c): undefined reference to `g_ecg_gen_v6'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,51 @@
Command: ninja flash
[1/5] C:\Windows\system32\cmd.exe /C "cd /D C:\Users\29096\Desktop\work\SIM\SIM_S3_1\build\esp-idf\esptool_py && C:\Espressif\python_env\idf5.5_py3.11_env\Scripts\python.exe C:/Espressif/frameworks/esp-idf-v5.5/components/partition_table/check_sizes.py --offset 0x8000 partition --type app C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/partition_table/partition-table.bin C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin"
SIM_S3_1.bin binary size 0x479f0 bytes. Smallest app partition is 0x300000 bytes. 0x2b8610 bytes (91%) free.
[2/5] Performing build step for 'bootloader'
[1/1] C:\Windows\system32\cmd.exe /C "cd /D C:\Users\29096\Desktop\work\SIM\SIM_S3_1\build\bootloader\esp-idf\esptool_py && C:\Espressif\python_env\idf5.5_py3.11_env\Scripts\python.exe C:/Espressif/frameworks/esp-idf-v5.5/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/bootloader.bin"
Bootloader binary size 0x5260 bytes. 0x2da0 bytes (36%) free.
[3/5] No install step for 'bootloader'
[4/5] Completed 'bootloader'
[4/5] C:\Windows\system32\cmd.exe /C "cd /D C:\Espressif\frameworks\esp-idf-v5.5\components\esptool_py && C:\Espressif\tools\cmake\3.30.2\bin\cmake.exe -D IDF_PATH=C:/Espressif/frameworks/esp-idf-v5.5 -D SERIAL_TOOL=C:/Espressif/python_env/idf5.5_py3.11_env/Scripts/python.exe;;C:/Espressif/frameworks/esp-idf-v5.5/components/esptool_py/esptool/esptool.py;--chip;esp32s3 -D SERIAL_TOOL_ARGS=--before=default_reset;--after=hard_reset;write_flash;@flash_args -D WORKING_DIRECTORY=C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build -P C:/Espressif/frameworks/esp-idf-v5.5/components/esptool_py/run_serial_tool.cmake"
esptool.py --chip esp32s3 -p COM16 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 80m --flash_size 8MB 0x0 bootloader/bootloader.bin 0x10000 SIM_S3_1.bin 0x8000 partition_table/partition-table.bin
esptool.py v4.9.1
Serial port COM16
Connecting....
Chip is ESP32-S3 (QFN56) (revision v0.2)
Features: WiFi, BLE, Embedded PSRAM 8MB (AP_3v3)
Crystal is 40MHz
MAC: 64:e8:33:4c:69:b4
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00005fff...
Flash will be erased from 0x00010000 to 0x00057fff...
Flash will be erased from 0x00008000 to 0x00008fff...
SHA digest in image updated
Compressed 21088 bytes to 13420...
Writing at 0x00000000... (100 %)
Wrote 21088 bytes (13420 compressed) at 0x00000000 in 0.7 seconds (effective 237.5 kbit/s)...
Hash of data verified.
Compressed 293360 bytes to 152483...
Writing at 0x00010000... (10 %)
Writing at 0x0001caf3... (20 %)
Writing at 0x0002490f... (30 %)
Writing at 0x0002b467... (40 %)
Writing at 0x0003173d... (50 %)
Writing at 0x0003b66b... (60 %)
Writing at 0x000423f6... (70 %)
Writing at 0x00048ef9... (80 %)
Writing at 0x0004ecc9... (90 %)
Writing at 0x0005566b... (100 %)
Wrote 293360 bytes (152483 compressed) at 0x00010000 in 3.6 seconds (effective 652.1 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 119...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (119 compressed) at 0x00008000 in 0.1 seconds (effective 296.1 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...

View File

@ -1,7 +1,7 @@
{ {
"version": "1.2", "version": "1.2",
"project_name": "SIM_S3_1", "project_name": "SIM_S3_1",
"project_version": "aa5edb1-dirty", "project_version": "b04950d-dirty",
"project_path": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1", "project_path": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1",
"idf_path": "C:/Espressif/frameworks/esp-idf-v5.5", "idf_path": "C:/Espressif/frameworks/esp-idf-v5.5",
"build_dir": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build", "build_dir": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build",

View File

@ -3,7 +3,6 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -56,7 +55,10 @@ typedef struct {
uint32_t samples_per_point; // 每个表点对应的样本数 uint32_t samples_per_point; // 每个表点对应的样本数
uint32_t sample_counter; // 当前表点的样本计数器 uint32_t sample_counter; // 当前表点的样本计数器
} ecg_generator_t; } ecg_generator_t;
// 外部变量声明需要在main.c中定义
extern ecg_generator_t g_ecg_gen_i, g_ecg_gen_ii, g_ecg_gen_v1, g_ecg_gen_v2,
g_ecg_gen_v3, g_ecg_gen_v4, g_ecg_gen_v5, g_ecg_gen_v6,
g_ecg_gen_iii;
// 函数声明 // 函数声明
void ecg_generator_init(ecg_generator_t *generator, float sample_rate, ecg_lead_t lead); void ecg_generator_init(ecg_generator_t *generator, float sample_rate, ecg_lead_t lead);
void ecg_generator_set_heart_rate(ecg_generator_t *generator, float heart_rate); void ecg_generator_set_heart_rate(ecg_generator_t *generator, float heart_rate);
@ -75,6 +77,12 @@ void ecg_param_set(ecg_generator_t *generator, float amplitude_mv, float heart_r
void ecg_generator_set_lead_parameters(ecg_generator_t *generator, ecg_lead_t lead); void ecg_generator_set_lead_parameters(ecg_generator_t *generator, ecg_lead_t lead);
float ecg_generator_calculate_sample_realtime(ecg_generator_t *generator); float ecg_generator_calculate_sample_realtime(ecg_generator_t *generator);
// 十二导联输出函数
void ecg_generator_output_twelve_leads(void (*set_channel_voltage)(uint8_t channel, float voltage));
// 完整的十二导联ECG系统初始化函数
int ecg_generator_init_twelve_leads_system(float sample_rate, float amplitude, float heart_rate);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -4,6 +4,16 @@
#include "esp_log.h" #include "esp_log.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
// 信号生成器相关
ecg_generator_t g_ecg_gen_i; // I导联ECG生成器
ecg_generator_t g_ecg_gen_ii; // II导联ECG生成器
ecg_generator_t g_ecg_gen_iii; // III导联ECG生成器
ecg_generator_t g_ecg_gen_v1; // V1导联ECG生成器
ecg_generator_t g_ecg_gen_v2; // V2导联ECG生成器
ecg_generator_t g_ecg_gen_v3; // V3导联ECG生成器
ecg_generator_t g_ecg_gen_v4; // V4导联ECG生成器
ecg_generator_t g_ecg_gen_v5; // V5导联ECG生成器
ecg_generator_t g_ecg_gen_v6; // V6导联ECG生成器
// 初始化ECG生成器 // 初始化ECG生成器
void ecg_generator_init(ecg_generator_t *generator, float sample_rate, ecg_lead_t lead) { void ecg_generator_init(ecg_generator_t *generator, float sample_rate, ecg_lead_t lead) {
if (generator == NULL) return; if (generator == NULL) return;
@ -437,4 +447,97 @@ void ecg_generator_cleanup(ecg_generator_t *generator) {
ecg_generator_stop(generator); ecg_generator_stop(generator);
ecg_generator_free_lookup_table(generator); ecg_generator_free_lookup_table(generator);
ESP_LOGI("ECG_GEN", "ECG generator cleaned up."); ESP_LOGI("ECG_GEN", "ECG generator cleaned up.");
}
// 十二导联输出函数
void ecg_generator_output_twelve_leads(void (*set_channel_voltage)(uint8_t channel, float voltage)) {
if (set_channel_voltage == NULL) return;
float voltage;
// 通道映射0通道输出I导联1通道输出II导联2-7通道输出V1-V6导联
voltage = ecg_generator_get_next_sample(&g_ecg_gen_i);
set_channel_voltage(0, voltage); // 通道0I导联
voltage = ecg_generator_get_next_sample(&g_ecg_gen_ii);
set_channel_voltage(1, voltage); // 通道1II导联
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v1);
set_channel_voltage(2, voltage); // 通道2V1导联
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v2);
set_channel_voltage(3, voltage); // 通道3V2导联
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v3);
set_channel_voltage(4, voltage); // 通道4V3导联
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v4);
set_channel_voltage(5, voltage); // 通道5V4导联
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v5);
set_channel_voltage(6, voltage); // 通道6V5导联
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v6);
set_channel_voltage(7, voltage); // 通道7V6导联
}
// 完整的十二导联ECG信号生成封装函数
int ecg_generator_init_twelve_leads_system(float sample_rate, float amplitude, float heart_rate) {
// 初始化I导联
ecg_generator_init(&g_ecg_gen_i, sample_rate, ECG_LEAD_I);
ecg_param_set(&g_ecg_gen_i, amplitude, heart_rate);
ecg_generator_generate_lookup_table(&g_ecg_gen_i);
ecg_generator_start(&g_ecg_gen_i);
// 初始化II导联
ecg_generator_init(&g_ecg_gen_ii, sample_rate, ECG_LEAD_II);
ecg_param_set(&g_ecg_gen_ii, amplitude, heart_rate);
ecg_generator_generate_lookup_table(&g_ecg_gen_ii);
ecg_generator_start(&g_ecg_gen_ii);
// 初始化III导联
ecg_generator_init(&g_ecg_gen_iii, sample_rate, ECG_LEAD_III);
ecg_param_set(&g_ecg_gen_iii, amplitude, heart_rate);
ecg_generator_generate_lookup_table(&g_ecg_gen_iii);
ecg_generator_start(&g_ecg_gen_iii);
// 初始化V1导联
ecg_generator_init(&g_ecg_gen_v1, sample_rate, ECG_LEAD_V1);
ecg_param_set(&g_ecg_gen_v1, amplitude, heart_rate);
ecg_generator_generate_lookup_table(&g_ecg_gen_v1);
ecg_generator_start(&g_ecg_gen_v1);
// 初始化V2导联
ecg_generator_init(&g_ecg_gen_v2, sample_rate, ECG_LEAD_V2);
ecg_param_set(&g_ecg_gen_v2, amplitude, heart_rate);
ecg_generator_generate_lookup_table(&g_ecg_gen_v2);
ecg_generator_start(&g_ecg_gen_v2);
// 初始化V3导联
ecg_generator_init(&g_ecg_gen_v3, sample_rate, ECG_LEAD_V3);
ecg_param_set(&g_ecg_gen_v3, amplitude, heart_rate);
ecg_generator_generate_lookup_table(&g_ecg_gen_v3);
ecg_generator_start(&g_ecg_gen_v3);
// 初始化V4导联
ecg_generator_init(&g_ecg_gen_v4, sample_rate, ECG_LEAD_V4);
ecg_param_set(&g_ecg_gen_v4, amplitude, heart_rate);
ecg_generator_generate_lookup_table(&g_ecg_gen_v4);
ecg_generator_start(&g_ecg_gen_v4);
// 初始化V5导联
ecg_generator_init(&g_ecg_gen_v5, sample_rate, ECG_LEAD_V5);
ecg_param_set(&g_ecg_gen_v5, amplitude, heart_rate);
ecg_generator_generate_lookup_table(&g_ecg_gen_v5);
ecg_generator_start(&g_ecg_gen_v5);
// 初始化V6导联
ecg_generator_init(&g_ecg_gen_v6, sample_rate, ECG_LEAD_V6);
ecg_param_set(&g_ecg_gen_v6, amplitude, heart_rate);
ecg_generator_generate_lookup_table(&g_ecg_gen_v6);
ecg_generator_start(&g_ecg_gen_v6);
ESP_LOGI("ECG_GEN", "所有导联初始化完成输出到DAC通道 0-7");
ESP_LOGI("ECG_GEN", "通道映射0=I导联, 1=II导联, 2=V1, 3=V2, 4=V3, 5=V4, 6=V5, 7=V6");
return 0; // 成功
} }

View File

@ -4,131 +4,40 @@
#include <esp_system.h> #include <esp_system.h>
#include <math.h> #include <math.h>
#include "ecg_generator.h" #include "ecg_generator.h"
#include "sine_generator.h"
#include "esp_timer.h" #include "esp_timer.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "freertos/task.h"
#include "driver/gpio.h"
EventGroupHandle_t my_event_group;
// 按键定义
#define BUTTON_PIN GPIO_NUM_0 // 使用GPIO0作为按键输入
#define BUTTON_DEBOUNCE_MS 200 // 防抖时间
static const char *TAG = "MAIN"; static const char *TAG = "MAIN";
// 信号生成器相关
static ecg_generator_t g_ecg_gen_i; // I导联ECG生成器
static ecg_generator_t g_ecg_gen_ii; // II导联ECG生成器
static ecg_generator_t g_ecg_gen_v1; // V1导联ECG生成器
static ecg_generator_t g_ecg_gen_v2; // V2导联ECG生成器
static ecg_generator_t g_ecg_gen_v3; // V3导联ECG生成器
static ecg_generator_t g_ecg_gen_v4; // V4导联ECG生成器
static ecg_generator_t g_ecg_gen_v5; // V5导联ECG生成器
static ecg_generator_t g_ecg_gen_v6; // V6导联ECG生成器
static sine_generator_t g_sine_gen;
static esp_timer_handle_t signal_timer = NULL; static esp_timer_handle_t signal_timer = NULL;
static uint32_t signal_sample_count = 0; static uint32_t signal_sample_count = 0;
static uint32_t signal_last_log_time = 0; static uint32_t signal_last_log_time = 0;
static bool use_sine_wave = true; // true=正弦波, false=ECG
// 移除use_lead_i变量因为现在同时输出两个导联
// 信号生成器定时器回调函数 // 信号生成器定时器回调函数
static void signal_timer_callback(void* arg) { static void signal_timer_callback(void* arg) {
float signal_voltage = 0.0f; // ECG十二导联模式使用十二导联输出函数
ecg_generator_output_twelve_leads(set_channel_voltage);
if (use_sine_wave) {
// 生成正弦波样本
signal_voltage = sine_generator_get_next_sample(&g_sine_gen);
// 输出到DAC通道2
set_channel_voltage(2, signal_voltage);
} else {
// ECG模式同时输出多个导联
// I导联输出到通道2
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_i);
set_channel_voltage(2, signal_voltage);
// II导联输出到通道3
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_ii);
set_channel_voltage(3, signal_voltage);
// V1导联输出到通道4
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_v1);
set_channel_voltage(4, signal_voltage);
// V2导联输出到通道5
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_v2);
set_channel_voltage(5, signal_voltage);
// V3导联输出到通道6
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_v3);
set_channel_voltage(6, signal_voltage);
// V4导联输出到通道7
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_v4);
set_channel_voltage(7, signal_voltage);
// V5、V6导联生成器已实现但不输出到通道
ecg_generator_get_next_sample(&g_ecg_gen_v5);
ecg_generator_get_next_sample(&g_ecg_gen_v6);
}
signal_sample_count++; signal_sample_count++;
// 减少日志输出频率,避免影响高频中断性能
// 每20000个样本输出一次统计信息约1秒
if (signal_sample_count >= 20000) {
if (use_sine_wave) {
ESP_LOGI(TAG, "Generated %u samples at 20kHz (Sine Wave)", signal_sample_count);
} else {
ESP_LOGI(TAG, "Generated %u samples at 20kHz (ECG I+II+V1+V2+V3+V4)", signal_sample_count);
}
signal_sample_count = 0;
signal_last_log_time = esp_timer_get_time() / 1000;
}
} }
// 函数声明 // 函数声明
void displayMemoryUsage(void); void displayMemoryUsage(void);
void test_signal_generation(void); void init_ecg_system(void);
void switch_to_ecg_mode(void); void init_hardware(void);
void switch_to_sine_mode(void);
void switch_ecg_lead(void);
// 信号生成器测试函数 // ECG系统初始化函数
void test_signal_generation(void) { void init_ecg_system(void) {
ESP_LOGI(TAG, "=== Signal Generation Test ==="); ESP_LOGI(TAG, "=== 初始化ECG十二导联系统 ===");
// 初始化ECG生成器 // 使用封装函数初始化所有ECG导联
ecg_generator_init(&g_ecg_gen_i, 20000.0f, ECG_LEAD_I); // I导联20kHz生成率 int ret = ecg_generator_init_twelve_leads_system(20000.0f, 5.0f, 75.0f); // 20kHz, 5V, 75BPM
ecg_param_set(&g_ecg_gen_i, 5.0f, 75.0f); if (ret != 0) {
ESP_LOGE(TAG, "Failed to initialize ECG system");
ecg_generator_init(&g_ecg_gen_ii, 20000.0f, ECG_LEAD_II); // II导联20kHz生成率 return;
ecg_param_set(&g_ecg_gen_ii, 5.0f, 75.0f); }
ecg_generator_init(&g_ecg_gen_v1, 20000.0f, ECG_LEAD_V1); // V1导联20kHz生成率
ecg_param_set(&g_ecg_gen_v1, 5.0f, 75.0f);
ecg_generator_init(&g_ecg_gen_v2, 20000.0f, ECG_LEAD_V2); // V2导联20kHz生成率
ecg_param_set(&g_ecg_gen_v2, 5.0f, 75.0f);
ecg_generator_init(&g_ecg_gen_v3, 20000.0f, ECG_LEAD_V3); // V3导联20kHz生成率
ecg_param_set(&g_ecg_gen_v3, 5.0f, 75.0f);
ecg_generator_init(&g_ecg_gen_v4, 20000.0f, ECG_LEAD_V4); // V4导联20kHz生成率
ecg_param_set(&g_ecg_gen_v4, 5.0f, 75.0f);
ecg_generator_init(&g_ecg_gen_v5, 20000.0f, ECG_LEAD_V5); // V5导联20kHz生成率
ecg_param_set(&g_ecg_gen_v5, 5.0f, 75.0f);
ecg_generator_init(&g_ecg_gen_v6, 20000.0f, ECG_LEAD_V6); // V6导联20kHz生成率
ecg_param_set(&g_ecg_gen_v6, 5.0f, 75.0f);
// 初始化正弦波生成器
sine_generator_init(&g_sine_gen, 20000.0f); // 20kHz生成率
sine_generator_set_frequency(&g_sine_gen, 10.0f); // 10Hz正弦波
sine_generator_set_amplitude(&g_sine_gen, 5.0f); // 5mV
// 创建定时器配置 // 创建定时器配置
const esp_timer_create_args_t timer_args = { const esp_timer_create_args_t timer_args = {
@ -137,108 +46,29 @@ void test_signal_generation(void) {
}; };
// 创建定时器 // 创建定时器
esp_err_t ret = esp_timer_create(&timer_args, &signal_timer); ret = esp_timer_create(&timer_args, &signal_timer);
if (ret != ESP_OK) { if (ret != 0) {
ESP_LOGE(TAG, "Failed to create signal timer: %s", esp_err_to_name(ret)); ESP_LOGE(TAG, "Failed to create signal timer");
return; return;
} }
// 启动信号生成器
if (use_sine_wave) {
sine_generator_start(&g_sine_gen);
ESP_LOGI(TAG, "Started sine wave generator: 10Hz, 5mV");
} else {
// 同时启动多个ECG导联
ecg_generator_start(&g_ecg_gen_i);
ecg_generator_start(&g_ecg_gen_ii);
ecg_generator_start(&g_ecg_gen_v1);
ecg_generator_start(&g_ecg_gen_v2);
ecg_generator_start(&g_ecg_gen_v3);
ecg_generator_start(&g_ecg_gen_v4);
ecg_generator_start(&g_ecg_gen_v5);
ecg_generator_start(&g_ecg_gen_v6);
ESP_LOGI(TAG, "Started ECG generators: I+II+V1+V2+V3+V4+V5+V6, 75 BPM, 5mV");
}
// 启动定时器 (50us = 20kHz) // 启动定时器 (50us = 20kHz)
ret = esp_timer_start_periodic(signal_timer, 50); // 50微秒 = 20kHz ret = esp_timer_start_periodic(signal_timer, 50); // 50微秒 = 20kHz
if (ret != ESP_OK) { if (ret != 0) {
ESP_LOGE(TAG, "Failed to start signal timer: %s", esp_err_to_name(ret)); ESP_LOGE(TAG, "Failed to start signal timer");
esp_timer_delete(signal_timer); esp_timer_delete(signal_timer);
return; return;
} }
ESP_LOGI(TAG, "Signal timer started at 20kHz (50us period)"); ESP_LOGI(TAG, "ECG系统初始化完成定时器启动在20kHz (50us周期)");
} }
void init_hardware(void)
// 切换到ECG模式 {
void switch_to_ecg_mode(void) { // 硬件初始化
if (use_sine_wave) { bsp_i2c_init(); // I2C初始化
sine_generator_stop(&g_sine_gen); LED_init(); // LED初始化
// 同时启动多个ECG导联 init_ad5328(); // DAC初始化
ecg_generator_start(&g_ecg_gen_i); ESP_LOGI(TAG, "Hardware initialization completed.");
ecg_generator_start(&g_ecg_gen_ii);
ecg_generator_start(&g_ecg_gen_v1);
ecg_generator_start(&g_ecg_gen_v2);
ecg_generator_start(&g_ecg_gen_v3);
ecg_generator_start(&g_ecg_gen_v4);
ecg_generator_start(&g_ecg_gen_v5);
ecg_generator_start(&g_ecg_gen_v6);
ESP_LOGI(TAG, "Switched to ECG mode (I+SII+V1+V2+V3+V4)");
use_sine_wave = false;
}
}
// 切换到正弦波模式
void switch_to_sine_mode(void) {
if (!use_sine_wave) {
// 停止所有ECG导联
ecg_generator_stop(&g_ecg_gen_i);
ecg_generator_stop(&g_ecg_gen_ii);
ecg_generator_stop(&g_ecg_gen_v1);
ecg_generator_stop(&g_ecg_gen_v2);
ecg_generator_stop(&g_ecg_gen_v3);
ecg_generator_stop(&g_ecg_gen_v4);
ecg_generator_stop(&g_ecg_gen_v5);
ecg_generator_stop(&g_ecg_gen_v6);
sine_generator_start(&g_sine_gen);
use_sine_wave = true;
ESP_LOGI(TAG, "Switched to sine wave mode");
}
}
// 切换ECG导联现在不需要因为同时输出两个导联
void switch_ecg_lead(void) {
// 此函数保留但不使用因为现在同时输出I导联和II导联
ESP_LOGI(TAG, "ECG mode: Both I导联 and II导联 are active simultaneously");
}
// 按键初始化
void button_init(void) {
gpio_config_t io_conf = {};
io_conf.intr_type = GPIO_INTR_DISABLE;
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pin_bit_mask = (1ULL << BUTTON_PIN);
io_conf.pull_down_en = 0;
io_conf.pull_up_en = 1; // 启用上拉电阻
gpio_config(&io_conf);
ESP_LOGI(TAG, "Button initialized on GPIO %d", BUTTON_PIN);
}
// 检测按键按下
bool button_pressed(void) {
static uint32_t last_press_time = 0;
uint32_t current_time = esp_timer_get_time() / 1000; // 转换为毫秒
// 检测按键按下(低电平)
if (gpio_get_level(BUTTON_PIN) == 0) {
// 防抖处理
if (current_time - last_press_time > BUTTON_DEBOUNCE_MS) {
last_press_time = current_time;
return true;
}
}
return false;
} }
// 打印内存使用情况 // 打印内存使用情况
@ -266,42 +96,15 @@ void displayMemoryUsage() {
// 主函数 // 主函数
void app_main(void) void app_main(void)
{ {
ESP_LOGI(TAG, "Starting ECG application...");
// 硬件初始化
bsp_i2c_init(); // I2C初始化
LED_init(); // LED初始化
init_ad5328(); // DAC初始化
button_init(); // 按键初始化
my_event_group = xEventGroupCreate();
ESP_LOGI(TAG, "Hardware initialization completed.");
// 启动信号生成
test_signal_generation();
// LED状态指示
ESP_LOGI(TAG, "Starting LED status indicator...");
int led_count = 0; int led_count = 0;
init_hardware();
init_ecg_system();
while (true) { while (true) {
// 检测按键按下
if (button_pressed()) {
if (use_sine_wave) {
switch_to_ecg_mode();
} else {
// 在ECG模式下按键切换回正弦波
switch_to_sine_mode();
}
}
// LED闪烁指示系统运行 // LED闪烁指示系统运行
gpio_set_level(LED_PIN, 1); // LED亮 gpio_set_level(LED_PIN, 1); // LED亮
vTaskDelay(pdMS_TO_TICKS(1000)); vTaskDelay(pdMS_TO_TICKS(1000));
gpio_set_level(LED_PIN, 0); // LED灭 gpio_set_level(LED_PIN, 0); // LED灭
vTaskDelay(pdMS_TO_TICKS(1000)); vTaskDelay(pdMS_TO_TICKS(1000));
// 每10次循环显示一次内存使用情况 // 每10次循环显示一次内存使用情况
if (++led_count % 10 == 0) { if (++led_count % 10 == 0) {
displayMemoryUsage(); displayMemoryUsage();

24
test_compile.bat Normal file
View File

@ -0,0 +1,24 @@
@echo off
echo Testing syntax compilation...
echo.
echo Checking main.c syntax...
gcc -I components/signal_generators/include -I main -fsyntax-only main/main.c
if %errorlevel% equ 0 (
echo main.c: OK
) else (
echo main.c: ERROR
)
echo.
echo Checking ecg_generator.c syntax...
gcc -I components/signal_generators/include -fsyntax-only components/signal_generators/src/ecg_generator.c
if %errorlevel% equ 0 (
echo ecg_generator.c: OK
) else (
echo ecg_generator.c: ERROR
)
echo.
echo Syntax check complete.
pause

View File

@ -0,0 +1,389 @@
# ECG十二导联信号生成系统 - 工作交接文档
## 项目概述
本项目是一个基于ESP32-S3的ECG心电图十二导联信号生成系统能够同时生成并输出I、II、III导联以及V1-V6胸导联的ECG信号通过DAC芯片输出到8个独立通道。
### 主要功能
- **十二导联ECG信号生成**I、II、III、V1-V6导联
- **多通道DAC输出**8个独立通道同时输出
- **高精度波形生成**20kHz采样率支持10,000点查找表
- **内存优化**PSRAM存储防止DRAM溢出
- **实时信号处理**50μs定时器中断
---
## 系统架构
### 硬件平台
- **主控芯片**ESP32-S3
- **DAC芯片**AD5328BRUZ8通道12位DAC
- **通信接口**SPI2DAC控制、I2C0触摸屏
- **显示**ST7789 LCD + FT5x06触摸屏
### 软件架构
```
main/
├── main.c # 主程序入口
├── esp32_s3_szp.c # 硬件驱动SPI、I2C、LCD
├── esp32_s3_szp.h # 硬件定义
└── app_ui.c # UI界面
components/signal_generators/
├── include/
│ ├── ecg_generator.h # ECG生成器接口
│ └── sine_generator.h # 正弦波生成器接口
└── src/
├── ecg_generator.c # ECG生成器实现
└── sine_generator.c # 正弦波生成器实现
```
---
## 核心代码功能详解
### 1. ECG信号生成器 (`ecg_generator.c`)
#### 1.1 导联类型定义
```c
typedef enum {
ECG_LEAD_I = 0, // I导联右手到左手
ECG_LEAD_II = 1, // II导联右手到左腿
ECG_LEAD_III = 2, // III导联左手到左腿
ECG_LEAD_V1 = 3, // V1导联胸骨右缘第四肋间
ECG_LEAD_V2 = 4, // V2导联
ECG_LEAD_V3 = 5, // V3导联过渡区
ECG_LEAD_V4 = 6, // V4导联高R波
ECG_LEAD_V5 = 7, // V5导联
ECG_LEAD_V6 = 8 // V6导联
} ecg_lead_t;
```
#### 1.2 ECG生成器结构体
```c
typedef struct {
// 用户参数
float heart_rate; // 心率 (次/分)
float amplitude; // 幅值 (V)
ecg_lead_t lead; // 当前导联
// 内部状态
uint32_t sample_count; // 样本计数器
float sample_rate; // 采样率 (Hz)
bool is_running; // 运行状态
// 导联特定参数
float p_amp_ratio; // P波幅度比例
float q_amp_ratio; // Q波幅度比例
float r_amp_ratio; // R波幅度比例
float s_amp_ratio; // S波幅度比例
float t_amp_ratio; // T波幅度比例
bool p_bidirectional; // P波是否双向V1导联特有
// 查找表相关
float* ecg_lookup_table; // ECG查找表
uint32_t table_size; // 查找表大小
uint32_t table_index; // 当前索引
// 按比例重复采样(防止相位失真)
uint32_t ideal_table_size; // 理想表大小
uint32_t samples_per_point; // 每个表点对应的样本数
uint32_t sample_counter; // 当前表点的样本计数器
} ecg_generator_t;
```
#### 1.3 关键算法:按比例重复采样
**问题**当理想表大小超过10,000点时需要限制表大小防止内存溢出但会导致相位失真。
**解决方案**:按比例重复采样
```c
// 计算理想表大小和实际表大小
generator->ideal_table_size = (uint32_t)(generator->sample_rate / generator->frequency);
const uint32_t MAX_TABLE_SIZE = 10000;
generator->table_size = generator->ideal_table_size;
if (generator->table_size > MAX_TABLE_SIZE) {
generator->table_size = MAX_TABLE_SIZE;
}
// 计算每个表点需要重复的样本数
generator->samples_per_point = generator->ideal_table_size / generator->table_size;
// 在get_next_sample中实现重复采样
if (generator->sample_counter >= generator->samples_per_point) {
generator->sample_counter = 0;
generator->table_index = (generator->table_index + 1) % generator->table_size;
}
```
#### 1.4 导联特定参数设置
每个导联都有独特的波形特征:
```c
void ecg_generator_set_lead_parameters(ecg_generator_t *generator, ecg_lead_t lead) {
switch (lead) {
case ECG_LEAD_I:
generator->p_amp_ratio = 0.12; // P波较小
generator->q_amp_ratio = 0.25;
generator->r_amp_ratio = 0.7; // R波中等
generator->s_amp_ratio = 0.3;
generator->t_amp_ratio = 0.3;
generator->p_bidirectional = false;
break;
case ECG_LEAD_V1:
generator->p_amp_ratio = 0.08; // P波双向
generator->q_amp_ratio = 0.0; // 无Q波
generator->r_amp_ratio = 0.25; // 小r波
generator->s_amp_ratio = 1.0; // 深S波
generator->t_amp_ratio = -0.15; // T波倒置
generator->p_bidirectional = true; // 双向P波
break;
// ... 其他导联
}
}
```
#### 1.5 双向P波实现V1导联特有
```c
// 在波形计算中
if (generator->p_bidirectional) {
// 双向P波先正后负
float p_positive = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) /
(2.0f * p_width_ratio * p_width_ratio));
float p_negative = -p_amp * 0.6f * expf(-(t_norm - (p_time_ratio + 0.02f)) *
(t_norm - (p_time_ratio + 0.02f)) /
(2.0f * p_width_ratio * p_width_ratio));
p = p_positive + p_negative;
} else {
// 单向P波
p = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) /
(2.0f * p_width_ratio * p_width_ratio));
}
```
### 2. 十二导联系统封装
#### 2.1 系统初始化函数
```c
int ecg_generator_init_twelve_leads_system(float sample_rate, float amplitude, float heart_rate) {
// 初始化所有9个导联生成器
ecg_generator_init(&g_ecg_gen_i, sample_rate, ECG_LEAD_I);
ecg_param_set(&g_ecg_gen_i, amplitude, heart_rate);
ecg_generator_generate_lookup_table(&g_ecg_gen_i);
ecg_generator_start(&g_ecg_gen_i);
// ... 重复其他8个导联
return 0; // 成功
}
```
#### 2.2 多通道输出函数
```c
void ecg_generator_output_twelve_leads(void (*set_channel_voltage)(uint8_t channel, float voltage)) {
float voltage;
// 通道映射0通道输出I导联1通道输出II导联2-7通道输出V1-V6导联
voltage = ecg_generator_get_next_sample(&g_ecg_gen_i);
set_channel_voltage(0, voltage); // 通道0I导联
voltage = ecg_generator_get_next_sample(&g_ecg_gen_ii);
set_channel_voltage(1, voltage); // 通道1II导联
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v1);
set_channel_voltage(2, voltage); // 通道2V1导联
// ... 其他通道
}
```
### 3. 硬件驱动 (`esp32_s3_szp.c`)
#### 3.1 SPI初始化
```c
// SPI总线配置
spi_bus_config_t bus_config = {
.miso_io_num = GPIO_NUM_NC, // 不使用MISO
.mosi_io_num = PIN_MOSI, // GPIO12
.sclk_io_num = PIN_SCK, // GPIO13
.quadhd_io_num = GPIO_NUM_NC,
.quadwp_io_num = GPIO_NUM_NC,
};
// SPI设备配置
spi_device_interface_config_t dev_config = {
.clock_speed_hz = 1000000, // 1 MHz
.mode = 0, // SPI模式0
.spics_io_num = PIN_CS, // GPIO10
.queue_size = 1,
.flags = SPI_DEVICE_HALFDUPLEX, // 半双工
};
```
#### 3.2 DAC数据发送
```c
void set_channel_voltage(uint8_t channel, float voltage) {
// 电压转数字值12位
uint16_t dac_value = (uint16_t)((voltage / V_REF) * 4095);
// 组装SPI数据包16位
uint8_t tx_data[2] = {
((channel & 0x07) << 4) | ((dac_value >> 8) & 0x0F), // 高字节
(dac_value & 0xFF) // 低字节
};
// SPI事务
spi_transaction_t t = {
.length = 16,
.tx_buffer = tx_data,
.rx_buffer = NULL
};
esp_err_t ret = spi_device_transmit(handle, &t);
}
```
### 4. 主程序 (`main.c`)
#### 4.1 系统初始化流程
```c
void app_main(void) {
int led_count = 0;
// 1. 硬件初始化
init_hardware(); // I2C、LED、DAC初始化
// 2. ECG系统初始化
init_ecg_system(); // 初始化十二导联系统
// 3. 主循环
while (true) {
// LED状态指示
gpio_set_level(LED_PIN, 1);
vTaskDelay(pdMS_TO_TICKS(1000));
gpio_set_level(LED_PIN, 0);
vTaskDelay(pdMS_TO_TICKS(1000));
// 内存监控
if (++led_count % 10 == 0) {
displayMemoryUsage();
}
}
}
```
#### 4.2 定时器中断处理
```c
static void signal_timer_callback(void* arg) {
// ECG十二导联模式使用十二导联输出函数
ecg_generator_output_twelve_leads(set_channel_voltage);
signal_sample_count++;
}
```
---
## 系统运行机制
### 1. 启动流程
1. **硬件初始化**I2C、SPI、GPIO配置
2. **DAC初始化**SPI总线、设备、控制引脚
3. **ECG系统初始化**9个导联生成器、查找表生成
4. **定时器启动**50μs周期20kHz
5. **主循环**LED指示、内存监控
### 2. 实时信号生成
1. **定时器中断**每50μs触发一次
2. **信号生成**:各导联生成器产生下一个样本
3. **DAC输出**8个通道同时更新电压
4. **相位同步**:所有导联保持同步
### 3. 内存管理
- **查找表存储**PSRAMheap_caps_malloc with MALLOC_CAP_SPIRAM
- **表大小限制**最大10,000点防止DRAM溢出
- **按比例采样**:保持波形形状和相位连续性
### 4. 通道映射
```
DAC通道 → ECG导联
通道0 → I导联
通道1 → II导联
通道2 → V1导联
通道3 → V2导联
通道4 → V3导联
通道5 → V4导联
通道6 → V5导联
通道7 → V6导联
```
---
## 技术参数
### 性能指标
- **采样率**20kHz
- **心率范围**30-200 BPM
- **电压范围**0-2.048V12位分辨率
- **查找表大小**最大10,000点
- **内存使用**PSRAM存储避免DRAM溢出
### 硬件接口
- **SPI2**DAC控制MOSI:GPIO12, SCK:GPIO13, CS:GPIO10
- **GPIO控制**LDAC(GPIO11), DAC_EN(GPIO17)
- **I2C0**触摸屏通信SDA:GPIO1, SCL:GPIO2
### 波形特征
- **I导联**R波中等P波较小
- **II导联**R波最大P波明显
- **III导联**波形介于I和II之间
- **V1导联**双向P波深S波T波倒置
- **V2-V6导联**过渡区到高R波区域
---
## 维护和调试
### 1. 常见问题排查
- **内存不足**检查PSRAM配置调整查找表大小
- **SPI通信失败**:检查引脚配置和时钟频率
- **波形失真**:验证按比例采样算法
- **相位不同步**:检查定时器配置
### 2. 性能优化
- **内存优化**使用PSRAM存储大查找表
- **实时性**50μs定时器确保20kHz输出
- **精度优化**12位DAC提供高精度输出
### 3. 扩展功能
- **参数调节**:心率、幅度、导联类型
- **波形存储**支持不同ECG模式
- **多设备支持**可扩展更多DAC通道
---
## 开发环境
### 编译环境
- **ESP-IDF**v5.0+
- **编译器**GCC for RISC-V
- **调试工具**ESP-IDF Monitor
### 依赖组件
- **esp_lcd_port**LCD显示
- **lvgl**:图形界面
- **esp_lcd_touch_ft5x06**:触摸屏
### 构建命令
```bash
idf.py build
idf.py flash monitor
---
**交接完成日期**2025年10月9日
**系统版本**v1.0