forth commit
This commit is contained in:
parent
b04950de34
commit
a182e5b445
|
|
@ -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.
1304
build/.ninja_log
1304
build/.ninja_log
File diff suppressed because it is too large
Load Diff
|
|
@ -1 +1 @@
|
|||
aa5edb1e1d1e2c9228e9ebe7a2633a8ec50ab3b3
|
||||
b04950de3478f58570bf2e7e2f85273adfc37c64
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
15546
build/SIM_S3_1.map
15546
build/SIM_S3_1.map
File diff suppressed because one or more lines are too long
|
|
@ -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
|
||||
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
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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 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
|
||||
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
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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.
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
Command: ninja all
|
||||
|
|
@ -0,0 +1 @@
|
|||
Command: ninja all
|
||||
|
|
@ -0,0 +1 @@
|
|||
Command: ninja all
|
||||
|
|
@ -0,0 +1 @@
|
|||
Command: ninja all
|
||||
|
|
@ -0,0 +1 @@
|
|||
Command: ninja flash
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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
|
|
@ -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...
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"version": "1.2",
|
||||
"project_name": "SIM_S3_1",
|
||||
"project_version": "aa5edb1-dirty",
|
||||
"project_version": "b04950d-dirty",
|
||||
"project_path": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1",
|
||||
"idf_path": "C:/Espressif/frameworks/esp-idf-v5.5",
|
||||
"build_dir": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build",
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
|
@ -56,7 +55,10 @@ typedef struct {
|
|||
uint32_t samples_per_point; // 每个表点对应的样本数
|
||||
uint32_t sample_counter; // 当前表点的样本计数器
|
||||
} 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_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);
|
||||
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
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -4,6 +4,16 @@
|
|||
#include "esp_log.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生成器
|
||||
void ecg_generator_init(ecg_generator_t *generator, float sample_rate, ecg_lead_t lead) {
|
||||
if (generator == NULL) return;
|
||||
|
|
@ -438,3 +448,96 @@ void ecg_generator_cleanup(ecg_generator_t *generator) {
|
|||
ecg_generator_free_lookup_table(generator);
|
||||
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); // 通道0:I导联
|
||||
|
||||
voltage = ecg_generator_get_next_sample(&g_ecg_gen_ii);
|
||||
set_channel_voltage(1, voltage); // 通道1:II导联
|
||||
|
||||
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v1);
|
||||
set_channel_voltage(2, voltage); // 通道2:V1导联
|
||||
|
||||
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v2);
|
||||
set_channel_voltage(3, voltage); // 通道3:V2导联
|
||||
|
||||
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v3);
|
||||
set_channel_voltage(4, voltage); // 通道4:V3导联
|
||||
|
||||
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v4);
|
||||
set_channel_voltage(5, voltage); // 通道5:V4导联
|
||||
|
||||
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v5);
|
||||
set_channel_voltage(6, voltage); // 通道6:V5导联
|
||||
|
||||
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v6);
|
||||
set_channel_voltage(7, voltage); // 通道7:V6导联
|
||||
}
|
||||
|
||||
// 完整的十二导联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; // 成功
|
||||
}
|
||||
253
main/main.c
253
main/main.c
|
|
@ -4,131 +4,40 @@
|
|||
#include <esp_system.h>
|
||||
#include <math.h>
|
||||
#include "ecg_generator.h"
|
||||
#include "sine_generator.h"
|
||||
#include "esp_timer.h"
|
||||
#include "freertos/FreeRTOS.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 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 uint32_t signal_sample_count = 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) {
|
||||
float signal_voltage = 0.0f;
|
||||
|
||||
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);
|
||||
}
|
||||
// ECG十二导联模式:使用十二导联输出函数
|
||||
ecg_generator_output_twelve_leads(set_channel_voltage);
|
||||
|
||||
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 test_signal_generation(void);
|
||||
void switch_to_ecg_mode(void);
|
||||
void switch_to_sine_mode(void);
|
||||
void switch_ecg_lead(void);
|
||||
void init_ecg_system(void);
|
||||
void init_hardware(void);
|
||||
|
||||
// 信号生成器测试函数
|
||||
void test_signal_generation(void) {
|
||||
ESP_LOGI(TAG, "=== Signal Generation Test ===");
|
||||
// ECG系统初始化函数
|
||||
void init_ecg_system(void) {
|
||||
ESP_LOGI(TAG, "=== 初始化ECG十二导联系统 ===");
|
||||
|
||||
// 初始化ECG生成器
|
||||
ecg_generator_init(&g_ecg_gen_i, 20000.0f, ECG_LEAD_I); // I导联,20kHz生成率
|
||||
ecg_param_set(&g_ecg_gen_i, 5.0f, 75.0f);
|
||||
|
||||
ecg_generator_init(&g_ecg_gen_ii, 20000.0f, ECG_LEAD_II); // II导联,20kHz生成率
|
||||
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
|
||||
// 使用封装函数初始化所有ECG导联
|
||||
int ret = ecg_generator_init_twelve_leads_system(20000.0f, 5.0f, 75.0f); // 20kHz, 5V, 75BPM
|
||||
if (ret != 0) {
|
||||
ESP_LOGE(TAG, "Failed to initialize ECG system");
|
||||
return;
|
||||
}
|
||||
|
||||
// 创建定时器配置
|
||||
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);
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Failed to create signal timer: %s", esp_err_to_name(ret));
|
||||
ret = esp_timer_create(&timer_args, &signal_timer);
|
||||
if (ret != 0) {
|
||||
ESP_LOGE(TAG, "Failed to create signal timer");
|
||||
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)
|
||||
ret = esp_timer_start_periodic(signal_timer, 50); // 50微秒 = 20kHz
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Failed to start signal timer: %s", esp_err_to_name(ret));
|
||||
if (ret != 0) {
|
||||
ESP_LOGE(TAG, "Failed to start signal timer");
|
||||
esp_timer_delete(signal_timer);
|
||||
return;
|
||||
}
|
||||
|
||||
ESP_LOGI(TAG, "Signal timer started at 20kHz (50us period)");
|
||||
ESP_LOGI(TAG, "ECG系统初始化完成,定时器启动在20kHz (50us周期)");
|
||||
}
|
||||
|
||||
// 切换到ECG模式
|
||||
void switch_to_ecg_mode(void) {
|
||||
if (use_sine_wave) {
|
||||
sine_generator_stop(&g_sine_gen);
|
||||
// 同时启动多个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, "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;
|
||||
void init_hardware(void)
|
||||
{
|
||||
// 硬件初始化
|
||||
bsp_i2c_init(); // I2C初始化
|
||||
LED_init(); // LED初始化
|
||||
init_ad5328(); // DAC初始化
|
||||
ESP_LOGI(TAG, "Hardware initialization completed.");
|
||||
}
|
||||
|
||||
// 打印内存使用情况
|
||||
|
|
@ -266,42 +96,15 @@ void displayMemoryUsage() {
|
|||
// 主函数
|
||||
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;
|
||||
|
||||
init_hardware();
|
||||
init_ecg_system();
|
||||
while (true) {
|
||||
// 检测按键按下
|
||||
if (button_pressed()) {
|
||||
if (use_sine_wave) {
|
||||
switch_to_ecg_mode();
|
||||
} else {
|
||||
// 在ECG模式下,按键切换回正弦波
|
||||
switch_to_sine_mode();
|
||||
}
|
||||
}
|
||||
|
||||
// LED闪烁指示系统运行
|
||||
gpio_set_level(LED_PIN, 1); // LED亮
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
|
||||
gpio_set_level(LED_PIN, 0); // LED灭
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
|
||||
// 每10次循环显示一次内存使用情况
|
||||
if (++led_count % 10 == 0) {
|
||||
displayMemoryUsage();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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芯片**:AD5328BRUZ(8通道12位DAC)
|
||||
- **通信接口**:SPI2(DAC控制)、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); // 通道0:I导联
|
||||
|
||||
voltage = ecg_generator_get_next_sample(&g_ecg_gen_ii);
|
||||
set_channel_voltage(1, voltage); // 通道1:II导联
|
||||
|
||||
voltage = ecg_generator_get_next_sample(&g_ecg_gen_v1);
|
||||
set_channel_voltage(2, voltage); // 通道2:V1导联
|
||||
|
||||
// ... 其他通道
|
||||
}
|
||||
```
|
||||
|
||||
### 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. 内存管理
|
||||
- **查找表存储**:PSRAM(heap_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.048V(12位分辨率)
|
||||
- **查找表大小**:最大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
|
||||
Loading…
Reference in New Issue