sin and ecg
This commit is contained in:
parent
1f3f204b0e
commit
ba9da78176
|
|
@ -1 +1 @@
|
||||||
8cfd9bd06a8d256eff6735ec8a0a3067 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin
|
539a7c49b582902925f4a1ed7feaaf69 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin
|
||||||
|
|
|
||||||
Binary file not shown.
1072
build/.ninja_log
1072
build/.ninja_log
File diff suppressed because it is too large
Load Diff
|
|
@ -548,7 +548,7 @@ CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
|
||||||
//ADVANCED property for variable: CMAKE_NM
|
//ADVANCED property for variable: CMAKE_NM
|
||||||
CMAKE_NM-ADVANCED:INTERNAL=1
|
CMAKE_NM-ADVANCED:INTERNAL=1
|
||||||
//number of local generators
|
//number of local generators
|
||||||
CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=127
|
CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=128
|
||||||
//ADVANCED property for variable: CMAKE_OBJCOPY
|
//ADVANCED property for variable: CMAKE_OBJCOPY
|
||||||
CMAKE_OBJCOPY-ADVANCED:INTERNAL=1
|
CMAKE_OBJCOPY-ADVANCED:INTERNAL=1
|
||||||
//ADVANCED property for variable: CMAKE_OBJDUMP
|
//ADVANCED property for variable: CMAKE_OBJDUMP
|
||||||
|
|
|
||||||
|
|
@ -869,6 +869,13 @@ C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/wifi_provisioning/CMakeFi
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/wifi_provisioning/CMakeFiles/install.dir
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/wifi_provisioning/CMakeFiles/install.dir
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/wifi_provisioning/CMakeFiles/install/local.dir
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/wifi_provisioning/CMakeFiles/install/local.dir
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/wifi_provisioning/CMakeFiles/install/strip.dir
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/wifi_provisioning/CMakeFiles/install/strip.dir
|
||||||
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/signal_generators/CMakeFiles/__idf_signal_generators.dir
|
||||||
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/signal_generators/CMakeFiles/edit_cache.dir
|
||||||
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/signal_generators/CMakeFiles/rebuild_cache.dir
|
||||||
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/signal_generators/CMakeFiles/list_install_components.dir
|
||||||
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/signal_generators/CMakeFiles/install.dir
|
||||||
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/signal_generators/CMakeFiles/install/local.dir
|
||||||
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/signal_generators/CMakeFiles/install/strip.dir
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch/CMakeFiles/__idf_espressif__esp_lcd_touch.dir
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch/CMakeFiles/__idf_espressif__esp_lcd_touch.dir
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch/CMakeFiles/edit_cache.dir
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch/CMakeFiles/edit_cache.dir
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch/CMakeFiles/rebuild_cache.dir
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch/CMakeFiles/rebuild_cache.dir
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
8c750b088c7cd857d079c0eeb495da199b359461
|
ref: refs/heads/master
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ set(HEAD_HASH)
|
||||||
file(READ "C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/CMakeFiles/git-data/HEAD" HEAD_CONTENTS LIMIT 1024)
|
file(READ "C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/CMakeFiles/git-data/HEAD" HEAD_CONTENTS LIMIT 1024)
|
||||||
|
|
||||||
string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
|
string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
|
||||||
set(GIT_DIR "C:/Espressif/frameworks/esp-idf-v5.5/.git")
|
set(GIT_DIR "C:/Users/29096/Desktop/work/SIM/SIM_S3_1/.git")
|
||||||
# handle git-worktree
|
# handle git-worktree
|
||||||
if(EXISTS "${GIT_DIR}/commondir")
|
if(EXISTS "${GIT_DIR}/commondir")
|
||||||
file(READ "${GIT_DIR}/commondir" GIT_DIR_NEW LIMIT 1024)
|
file(READ "${GIT_DIR}/commondir" GIT_DIR_NEW LIMIT 1024)
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
8c750b088c7cd857d079c0eeb495da199b359461
|
1f3f204b0ecebdd860e0b512a4f1512f37b33806
|
||||||
|
|
|
||||||
|
|
@ -1902,6 +1902,25 @@ rule C_STATIC_LIBRARY_LINKER____idf_wifi_provisioning_
|
||||||
restat = $RESTAT
|
restat = $RESTAT
|
||||||
|
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Rule for compiling C files.
|
||||||
|
|
||||||
|
rule C_COMPILER____idf_signal_generators_unscanned_
|
||||||
|
depfile = $DEP_FILE
|
||||||
|
deps = gcc
|
||||||
|
command = ccache ${LAUNCHER}${CODE_CHECK}C:\Espressif\tools\xtensa-esp-elf\esp-14.2.0_20241119\xtensa-esp-elf\bin\xtensa-esp32s3-elf-gcc.exe $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in
|
||||||
|
description = Building C object $out
|
||||||
|
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Rule for linking C static library.
|
||||||
|
|
||||||
|
rule C_STATIC_LIBRARY_LINKER____idf_signal_generators_
|
||||||
|
command = C:\Windows\system32\cmd.exe /C "$PRE_LINK && C:\Espressif\tools\cmake\3.30.2\bin\cmake.exe -E rm -f $TARGET_FILE && C:\Espressif\tools\xtensa-esp-elf\esp-14.2.0_20241119\xtensa-esp-elf\bin\xtensa-esp32s3-elf-ar.exe qc $TARGET_FILE $LINK_FLAGS $in && C:\Espressif\tools\xtensa-esp-elf\esp-14.2.0_20241119\xtensa-esp-elf\bin\xtensa-esp32s3-elf-ranlib.exe $TARGET_FILE && $POST_BUILD"
|
||||||
|
description = Linking C static library $TARGET_FILE
|
||||||
|
restat = $RESTAT
|
||||||
|
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# Rule for compiling C files.
|
# Rule for compiling C files.
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
11116
build/SIM_S3_1.map
11116
build/SIM_S3_1.map
File diff suppressed because one or more lines are too long
|
|
@ -268,3 +268,29 @@
|
||||||
42 294 7805000278051082 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
42 294 7805000278051082 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
50 176 7805000753646142 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
50 176 7805000753646142 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
50 176 7805000753646142 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
50 176 7805000753646142 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
46 236 7805582388533403 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
46 236 7805582388533403 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
34 207 7805582564848866 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
34 207 7805582564848866 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
89 399 7805583314101237 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
89 399 7805583314101237 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
84 437 7805583603501760 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
84 437 7805583603501760 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
34 213 7805584546925054 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
34 213 7805584546925054 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
31 153 7805585245398584 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
31 153 7805585245398584 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
31 200 7805587208615268 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
31 200 7805587208615268 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
31 203 7805588050136944 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
31 203 7805588050136944 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
33 169 7805588579474922 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
33 169 7805588579474922 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
33 313 7805693282341620 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
33 313 7805693282341620 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
32 148 7805693698692156 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
32 148 7805693698692156 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
30 186 7805695434134522 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
30 186 7805695434134522 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
30 144 7805695761097735 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
30 144 7805695761097735 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -562,6 +562,11 @@ if(NOT CMAKE_INSTALL_LOCAL_ONLY)
|
||||||
include("C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/wifi_provisioning/cmake_install.cmake")
|
include("C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/wifi_provisioning/cmake_install.cmake")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_INSTALL_LOCAL_ONLY)
|
||||||
|
# Include the install script for the subdirectory.
|
||||||
|
include("C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/signal_generators/cmake_install.cmake")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT CMAKE_INSTALL_LOCAL_ONLY)
|
if(NOT CMAKE_INSTALL_LOCAL_ONLY)
|
||||||
# Include the install script for the subdirectory.
|
# Include the install script for the subdirectory.
|
||||||
include("C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch/cmake_install.cmake")
|
include("C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch/cmake_install.cmake")
|
||||||
|
|
|
||||||
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,39 @@
|
||||||
|
# Install script for directory: C:/Users/29096/Desktop/work/SIM/SIM_S3_1/components/signal_generators
|
||||||
|
|
||||||
|
# Set the install prefix
|
||||||
|
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
|
||||||
|
set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/SIM_S3_1")
|
||||||
|
endif()
|
||||||
|
string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
||||||
|
|
||||||
|
# Set the install configuration name.
|
||||||
|
if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
|
||||||
|
if(BUILD_TYPE)
|
||||||
|
string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
|
||||||
|
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
|
||||||
|
else()
|
||||||
|
set(CMAKE_INSTALL_CONFIG_NAME "")
|
||||||
|
endif()
|
||||||
|
message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Set the component getting installed.
|
||||||
|
if(NOT CMAKE_INSTALL_COMPONENT)
|
||||||
|
if(COMPONENT)
|
||||||
|
message(STATUS "Install component: \"${COMPONENT}\"")
|
||||||
|
set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
|
||||||
|
else()
|
||||||
|
set(CMAKE_INSTALL_COMPONENT)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Is this installation the result of a crosscompile?
|
||||||
|
if(NOT DEFINED CMAKE_CROSSCOMPILING)
|
||||||
|
set(CMAKE_CROSSCOMPILING "TRUE")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Set path to fallback-tool for dependency-resolution.
|
||||||
|
if(NOT DEFINED CMAKE_OBJDUMP)
|
||||||
|
set(CMAKE_OBJDUMP "C:/Espressif/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32s3-elf-objdump.exe")
|
||||||
|
endif()
|
||||||
|
|
||||||
Binary file not shown.
|
|
@ -163,6 +163,7 @@ C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/touch_element/libtouch_el
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/usb/libusb.a
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/usb/libusb.a
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/wifi_provisioning/libwifi_provisioning.a
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/wifi_provisioning/libwifi_provisioning.a
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/json/libjson.a
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/json/libjson.a
|
||||||
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/signal_generators/libsignal_generators.a
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch/libespressif__esp_lcd_touch.a
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch/libespressif__esp_lcd_touch.a
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/esp_lcd/libesp_lcd.a
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/esp_lcd/libesp_lcd.a
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch_ft5x06/libespressif__esp_lcd_touch_ft5x06.a
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch_ft5x06/libespressif__esp_lcd_touch_ft5x06.a
|
||||||
|
|
@ -171,5 +172,8 @@ C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/lvgl__lvgl/liblvgl__lvgl.
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lvgl_port/libespressif__esp_lvgl_port.a
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lvgl_port/libespressif__esp_lvgl_port.a
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/lvgl__lvgl/liblvgl__lvgl.a
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/lvgl__lvgl/liblvgl__lvgl.a
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/main/libmain.a
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/main/libmain.a
|
||||||
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/signal_generators/libsignal_generators.a
|
||||||
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/spiffs/libspiffs.a
|
||||||
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/fatfs/libfatfs.a
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch_ft5x06/libespressif__esp_lcd_touch_ft5x06.a
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lcd_touch_ft5x06/libespressif__esp_lcd_touch_ft5x06.a
|
||||||
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lvgl_port/libespressif__esp_lvgl_port.a
|
C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/esp-idf/espressif__esp_lvgl_port/libespressif__esp_lvgl_port.a
|
||||||
|
|
|
||||||
|
|
@ -163,6 +163,7 @@ $<TARGET_FILE:idf::touch_element>
|
||||||
$<TARGET_FILE:idf::usb>
|
$<TARGET_FILE:idf::usb>
|
||||||
$<TARGET_FILE:idf::wifi_provisioning>
|
$<TARGET_FILE:idf::wifi_provisioning>
|
||||||
$<TARGET_FILE:__idf_json>
|
$<TARGET_FILE:__idf_json>
|
||||||
|
$<TARGET_FILE:idf::signal_generators>
|
||||||
$<TARGET_FILE:idf::espressif__esp_lcd_touch>
|
$<TARGET_FILE:idf::espressif__esp_lcd_touch>
|
||||||
$<TARGET_FILE:__idf_esp_lcd>
|
$<TARGET_FILE:__idf_esp_lcd>
|
||||||
$<TARGET_FILE:idf::espressif__esp_lcd_touch_ft5x06>
|
$<TARGET_FILE:idf::espressif__esp_lcd_touch_ft5x06>
|
||||||
|
|
@ -171,5 +172,8 @@ $<TARGET_FILE:idf::lvgl__lvgl>
|
||||||
$<TARGET_FILE:idf::espressif__esp_lvgl_port>
|
$<TARGET_FILE:idf::espressif__esp_lvgl_port>
|
||||||
$<TARGET_FILE:__idf_lvgl__lvgl>
|
$<TARGET_FILE:__idf_lvgl__lvgl>
|
||||||
$<TARGET_FILE:idf::main>
|
$<TARGET_FILE:idf::main>
|
||||||
|
$<TARGET_FILE:__idf_signal_generators>
|
||||||
|
$<TARGET_FILE:__idf_spiffs>
|
||||||
|
$<TARGET_FILE:__idf_fatfs>
|
||||||
$<TARGET_FILE:__idf_espressif__esp_lcd_touch_ft5x06>
|
$<TARGET_FILE:__idf_espressif__esp_lcd_touch_ft5x06>
|
||||||
$<TARGET_FILE:__idf_espressif__esp_lvgl_port>
|
$<TARGET_FILE:__idf_espressif__esp_lvgl_port>
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Command: ninja flash
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Command: ninja flash
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Command: ninja flash
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Command: ninja all
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Command: ninja all
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Command: ninja all
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Command: ninja all
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
||||||
|
Command: ninja all
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Command: ninja all
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Command: ninja all
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Command: ninja all
|
||||||
|
|
@ -1 +1 @@
|
||||||
Command: ninja all
|
Command: ninja flash
|
||||||
|
|
|
||||||
|
|
@ -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 0x48a60 bytes. Smallest app partition is 0x300000 bytes. 0x2b75a0 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 0x00058fff...
|
||||||
|
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 238.5 kbit/s)...
|
||||||
|
Hash of data verified.
|
||||||
|
Compressed 297568 bytes to 155289...
|
||||||
|
Writing at 0x00010000... (10 %)
|
||||||
|
Writing at 0x0001cd1c... (20 %)
|
||||||
|
Writing at 0x00024511... (30 %)
|
||||||
|
Writing at 0x0002aec2... (40 %)
|
||||||
|
Writing at 0x000313a5... (50 %)
|
||||||
|
Writing at 0x0003a51d... (60 %)
|
||||||
|
Writing at 0x00041c67... (70 %)
|
||||||
|
Writing at 0x00048ff5... (80 %)
|
||||||
|
Writing at 0x0004ed7b... (90 %)
|
||||||
|
Writing at 0x0005571a... (100 %)
|
||||||
|
Wrote 297568 bytes (155289 compressed) at 0x00010000 in 3.7 seconds (effective 650.9 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 282.4 kbit/s)...
|
||||||
|
Hash of data verified.
|
||||||
|
|
||||||
|
Leaving...
|
||||||
|
Hard resetting via RTS pin...
|
||||||
|
|
@ -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 0x48a60 bytes. Smallest app partition is 0x300000 bytes. 0x2b75a0 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 0x00058fff...
|
||||||
|
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 230.3 kbit/s)...
|
||||||
|
Hash of data verified.
|
||||||
|
Compressed 297568 bytes to 155289...
|
||||||
|
Writing at 0x00010000... (10 %)
|
||||||
|
Writing at 0x0001cd1c... (20 %)
|
||||||
|
Writing at 0x00024511... (30 %)
|
||||||
|
Writing at 0x0002aec2... (40 %)
|
||||||
|
Writing at 0x000313a5... (50 %)
|
||||||
|
Writing at 0x0003a51d... (60 %)
|
||||||
|
Writing at 0x00041c67... (70 %)
|
||||||
|
Writing at 0x00048ff5... (80 %)
|
||||||
|
Writing at 0x0004ed7b... (90 %)
|
||||||
|
Writing at 0x0005571a... (100 %)
|
||||||
|
Wrote 297568 bytes (155289 compressed) at 0x00010000 in 3.7 seconds (effective 652.0 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 288.3 kbit/s)...
|
||||||
|
Hash of data verified.
|
||||||
|
|
||||||
|
Leaving...
|
||||||
|
Hard resetting via RTS pin...
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
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 0x48830 bytes. Smallest app partition is 0x300000 bytes. 0x2b77d0 bytes (91%) 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 0x00058fff...
|
||||||
|
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 238.8 kbit/s)...
|
||||||
|
Hash of data verified.
|
||||||
|
Compressed 297008 bytes to 154976...
|
||||||
|
Writing at 0x00010000... (10 %)
|
||||||
|
Writing at 0x0001ccd9... (20 %)
|
||||||
|
Writing at 0x00024545... (30 %)
|
||||||
|
Writing at 0x0002af0b... (40 %)
|
||||||
|
Writing at 0x0003137a... (50 %)
|
||||||
|
Writing at 0x0003a568... (60 %)
|
||||||
|
Writing at 0x00041d81... (70 %)
|
||||||
|
Writing at 0x00048f5d... (80 %)
|
||||||
|
Writing at 0x0004ed1b... (90 %)
|
||||||
|
Writing at 0x00055699... (100 %)
|
||||||
|
Wrote 297008 bytes (154976 compressed) at 0x00010000 in 3.7 seconds (effective 647.2 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 373.9 kbit/s)...
|
||||||
|
Hash of data verified.
|
||||||
|
|
||||||
|
Leaving...
|
||||||
|
Hard resetting via RTS pin...
|
||||||
|
|
@ -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 0x48a60 bytes. Smallest app partition is 0x300000 bytes. 0x2b75a0 bytes (91%) free.
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -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 0x48a60 bytes. Smallest app partition is 0x300000 bytes. 0x2b75a0 bytes (91%) free.
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,8 @@
|
||||||
|
Command: ninja all
|
||||||
|
[1/4] 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 0x48a60 bytes. Smallest app partition is 0x300000 bytes. 0x2b75a0 bytes (91%) free.
|
||||||
|
[2/4] 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/4] No install step for 'bootloader'
|
||||||
|
[4/4] Completed 'bootloader'
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -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 0x48970 bytes. Smallest app partition is 0x300000 bytes. 0x2b7690 bytes (91%) free.
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,18 +1,61 @@
|
||||||
Command: ninja all
|
Command: ninja flash
|
||||||
[1/9] Performing build step for 'bootloader'
|
[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"
|
[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.
|
Bootloader binary size 0x5260 bytes. 0x2da0 bytes (36%) free.
|
||||||
[2/9] No install step for 'bootloader'
|
[3/10] No install step for 'bootloader'
|
||||||
[3/9] Completed 'bootloader'
|
[4/10] Linking C static library esp-idf\main\libmain.a
|
||||||
[4/9] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/ecg_generator.c.obj
|
[5/10] Completed 'bootloader'
|
||||||
[5/9] Linking C static library esp-idf\main\libmain.a
|
[6/10] Generating esp-idf/esp_system/ld/sections.ld
|
||||||
[6/9] Generating esp-idf/esp_system/ld/sections.ld
|
[7/10] Linking CXX executable SIM_S3_1.elf
|
||||||
[7/9] Linking CXX executable SIM_S3_1.elf
|
[8/10] Generating binary image from built executable
|
||||||
[8/9] Generating binary image from built executable
|
|
||||||
esptool.py v4.9.1
|
esptool.py v4.9.1
|
||||||
Creating esp32s3 image...
|
Creating esp32s3 image...
|
||||||
Merged 2 ELF sections
|
Merged 2 ELF sections
|
||||||
Successfully created esp32s3 image.
|
Successfully created esp32s3 image.
|
||||||
Generated C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin
|
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"
|
[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 0x47420 bytes. Smallest app partition is 0x300000 bytes. 0x2b8be0 bytes (91%) free.
|
SIM_S3_1.bin binary size 0x48a60 bytes. Smallest app partition is 0x300000 bytes. 0x2b75a0 bytes (91%) 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 0x00058fff...
|
||||||
|
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 297568 bytes to 155294...
|
||||||
|
Writing at 0x00010000... (10 %)
|
||||||
|
Writing at 0x0001cd14... (20 %)
|
||||||
|
Writing at 0x00024513... (30 %)
|
||||||
|
Writing at 0x0002aeb9... (40 %)
|
||||||
|
Writing at 0x0003138d... (50 %)
|
||||||
|
Writing at 0x0003a493... (60 %)
|
||||||
|
Writing at 0x00041c51... (70 %)
|
||||||
|
Writing at 0x00048fe2... (80 %)
|
||||||
|
Writing at 0x0004ed6d... (90 %)
|
||||||
|
Writing at 0x0005570c... (100 %)
|
||||||
|
Wrote 297568 bytes (155294 compressed) at 0x00010000 in 3.7 seconds (effective 647.8 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 277.8 kbit/s)...
|
||||||
|
Hash of data verified.
|
||||||
|
|
||||||
|
Leaving...
|
||||||
|
Hard resetting via RTS pin...
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,7 @@
|
||||||
|
idf_component_register(
|
||||||
|
SRCS
|
||||||
|
"src/ecg_generator.c"
|
||||||
|
"src/sine_generator.c"
|
||||||
|
INCLUDE_DIRS
|
||||||
|
"include"
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
# Signal Generators Library
|
||||||
|
|
||||||
|
这是一个ESP32信号生成器库,包含ECG(心电图)生成器和正弦波生成器。
|
||||||
|
|
||||||
|
## 功能特性
|
||||||
|
|
||||||
|
### ECG生成器 (ecg_generator)
|
||||||
|
- 生成逼真的心电图信号
|
||||||
|
- 可调节心率和幅度
|
||||||
|
- 包含P波、QRS波群、T波
|
||||||
|
- 支持实时参数调整
|
||||||
|
|
||||||
|
### 正弦波生成器 (sine_generator)
|
||||||
|
- 高频正弦波生成
|
||||||
|
- 预计算查找表优化
|
||||||
|
- 支持50kHz采样率
|
||||||
|
- 内存高效设计
|
||||||
|
|
||||||
|
## 使用方法
|
||||||
|
|
||||||
|
### ECG生成器
|
||||||
|
```c
|
||||||
|
#include "ecg_generator.h"
|
||||||
|
|
||||||
|
ecg_generator_t ecg_gen;
|
||||||
|
ecg_generator_init(&ecg_gen, 250.0f); // 250Hz采样率
|
||||||
|
ecg_generator_set_heart_rate(&ecg_gen, 75.0f); // 75 BPM
|
||||||
|
ecg_generator_set_amplitude(&ecg_gen, 5.0f); // 5mV
|
||||||
|
ecg_generator_start(&ecg_gen);
|
||||||
|
|
||||||
|
// 在定时器回调中
|
||||||
|
float sample = ecg_generator_get_next_sample(&ecg_gen);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 正弦波生成器
|
||||||
|
```c
|
||||||
|
#include "sine_generator.h"
|
||||||
|
|
||||||
|
sine_generator_t sine_gen;
|
||||||
|
sine_generator_init(&sine_gen, 50000.0f); // 50kHz采样率
|
||||||
|
sine_generator_set_frequency(&sine_gen, 200.0f); // 200Hz
|
||||||
|
sine_generator_set_amplitude(&sine_gen, 5.0f); // 5mV
|
||||||
|
sine_generator_start(&sine_gen);
|
||||||
|
|
||||||
|
// 在定时器回调中
|
||||||
|
float sample = sine_generator_get_next_sample(&sine_gen);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 性能优化
|
||||||
|
|
||||||
|
- ECG生成器:实时计算,适合低频应用
|
||||||
|
- 正弦波生成器:预计算查找表,适合高频应用
|
||||||
|
- 内存管理:自动分配和释放查找表
|
||||||
|
- 中断友好:最小化中断执行时间
|
||||||
|
|
||||||
|
## 依赖项
|
||||||
|
|
||||||
|
- ESP-IDF
|
||||||
|
- math库
|
||||||
|
- esp_log库
|
||||||
|
|
@ -40,6 +40,7 @@ void ecg_generator_start(ecg_generator_t *generator);
|
||||||
void ecg_generator_stop(ecg_generator_t *generator);
|
void ecg_generator_stop(ecg_generator_t *generator);
|
||||||
void ecg_generator_reset(ecg_generator_t *generator);
|
void ecg_generator_reset(ecg_generator_t *generator);
|
||||||
float ecg_generator_get_next_sample(ecg_generator_t *generator);
|
float ecg_generator_get_next_sample(ecg_generator_t *generator);
|
||||||
|
void ecg_param_set(ecg_generator_t *generator, float amplitude_mv, float heart_rate);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
#ifndef SINE_GENERATOR_H
|
||||||
|
#define SINE_GENERATOR_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 正弦波生成器结构体
|
||||||
|
typedef struct {
|
||||||
|
// 用户可调参数
|
||||||
|
float frequency; // 正弦波频率 (Hz)
|
||||||
|
float amplitude; // 幅值 (V)
|
||||||
|
|
||||||
|
// 内部状态
|
||||||
|
uint32_t sample_count; // 样本计数器
|
||||||
|
float sample_rate; // 采样率 (Hz)
|
||||||
|
bool is_running; // 是否正在运行
|
||||||
|
|
||||||
|
// 预计算正弦波查找表
|
||||||
|
float* sine_lookup_table; // 正弦波查找表
|
||||||
|
uint32_t table_size; // 查找表大小
|
||||||
|
uint32_t table_index; // 当前索引
|
||||||
|
} sine_generator_t;
|
||||||
|
|
||||||
|
// 函数声明
|
||||||
|
void sine_generator_init(sine_generator_t *generator, float sample_rate);
|
||||||
|
void sine_generator_set_frequency(sine_generator_t *generator, float frequency);
|
||||||
|
void sine_generator_set_amplitude(sine_generator_t *generator, float amplitude_mv);
|
||||||
|
void sine_generator_start(sine_generator_t *generator);
|
||||||
|
void sine_generator_stop(sine_generator_t *generator);
|
||||||
|
void sine_generator_reset(sine_generator_t *generator);
|
||||||
|
float sine_generator_get_next_sample(sine_generator_t *generator);
|
||||||
|
void sine_generator_cleanup(sine_generator_t *generator);
|
||||||
|
|
||||||
|
// 查找表管理函数
|
||||||
|
void sine_generator_generate_lookup_table(sine_generator_t *generator);
|
||||||
|
void sine_generator_free_lookup_table(sine_generator_t *generator);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // SINE_GENERATOR_H
|
||||||
|
|
@ -11,7 +11,7 @@ void ecg_generator_init(ecg_generator_t *generator, float sample_rate) {
|
||||||
|
|
||||||
// 设置默认参数
|
// 设置默认参数
|
||||||
generator->heart_rate = 75.0f; // 心率75次/分
|
generator->heart_rate = 75.0f; // 心率75次/分
|
||||||
generator->amplitude = 1.0f; // 幅值1.0V
|
generator->amplitude = 1.0f; // 幅值1.0mV
|
||||||
generator->sample_rate = sample_rate;
|
generator->sample_rate = sample_rate;
|
||||||
generator->is_running = false;
|
generator->is_running = false;
|
||||||
|
|
||||||
|
|
@ -28,6 +28,12 @@ void ecg_generator_init(ecg_generator_t *generator, float sample_rate) {
|
||||||
generator->t_width = 0.05f; // T波宽度
|
generator->t_width = 0.05f; // T波宽度
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ecg_param_set(ecg_generator_t *generator, float amplitude_mv, float heart_rate) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
ecg_generator_set_heart_rate(generator, heart_rate);
|
||||||
|
ecg_generator_set_amplitude(generator, amplitude_mv);
|
||||||
|
}
|
||||||
|
|
||||||
// 设置心率
|
// 设置心率
|
||||||
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) {
|
||||||
if (generator == NULL) return;
|
if (generator == NULL) return;
|
||||||
|
|
@ -0,0 +1,199 @@
|
||||||
|
#include "sine_generator.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "esp_log.h"
|
||||||
|
|
||||||
|
// 初始化正弦波生成器
|
||||||
|
void sine_generator_init(sine_generator_t *generator, float sample_rate) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
memset(generator, 0, sizeof(sine_generator_t));
|
||||||
|
|
||||||
|
// 设置默认参数
|
||||||
|
generator->frequency = 200.0f; // 默认200Hz正弦波
|
||||||
|
generator->amplitude = 1.0f; // 幅值1.0V
|
||||||
|
generator->sample_rate = sample_rate;
|
||||||
|
generator->is_running = false;
|
||||||
|
|
||||||
|
// 查找表参数
|
||||||
|
generator->sine_lookup_table = NULL;
|
||||||
|
generator->table_size = 0;
|
||||||
|
generator->table_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置正弦波频率
|
||||||
|
void sine_generator_set_frequency(sine_generator_t *generator, float frequency) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
// 限制频率范围
|
||||||
|
if (frequency < 0.1f) frequency = 0.1f;
|
||||||
|
if (frequency > 10000.0f) frequency = 10000.0f;
|
||||||
|
|
||||||
|
generator->frequency = frequency;
|
||||||
|
|
||||||
|
// 如果已经运行,重新生成查找表
|
||||||
|
if (generator->is_running) {
|
||||||
|
sine_generator_generate_lookup_table(generator);
|
||||||
|
}
|
||||||
|
|
||||||
|
ESP_LOGI("SINE_GEN", "Sine wave frequency set to: %.1f Hz", frequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置幅值(直接输入mV值,内部自动转换为DAC输出值)
|
||||||
|
void sine_generator_set_amplitude(sine_generator_t *generator, float amplitude_mv) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
// 硬件衰减系数:约38倍 (根据实际测量:0.132V → 5mV)
|
||||||
|
// 对应关系:amplitude(V) × 38 ≈ 示波器显示值(mV)
|
||||||
|
const float attenuation_factor = 38.0f;
|
||||||
|
|
||||||
|
// 将mV除以衰减系数得到DAC输出值
|
||||||
|
float dac_amplitude = amplitude_mv / attenuation_factor;
|
||||||
|
|
||||||
|
generator->amplitude = dac_amplitude;
|
||||||
|
|
||||||
|
// 如果已经运行,重新生成查找表
|
||||||
|
if (generator->is_running) {
|
||||||
|
sine_generator_generate_lookup_table(generator);
|
||||||
|
}
|
||||||
|
|
||||||
|
ESP_LOGI("SINE_GEN", "Sine wave amplitude set to: %.1f mV", amplitude_mv);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 开始生成
|
||||||
|
void sine_generator_start(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
generator->is_running = true;
|
||||||
|
generator->sample_count = 0;
|
||||||
|
|
||||||
|
// 生成查找表
|
||||||
|
sine_generator_generate_lookup_table(generator);
|
||||||
|
|
||||||
|
ESP_LOGI("SINE_GEN", "Sine generator started: %.1f Hz, %.1f mV",
|
||||||
|
generator->frequency, generator->amplitude * 38.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 停止生成
|
||||||
|
void sine_generator_stop(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
generator->is_running = false;
|
||||||
|
ESP_LOGI("SINE_GEN", "Sine generator stopped");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置生成器
|
||||||
|
void sine_generator_reset(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
generator->sample_count = 0;
|
||||||
|
generator->table_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取下一个样本
|
||||||
|
float sine_generator_get_next_sample(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL || !generator->is_running) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用预计算的查找表,超高速访问
|
||||||
|
if (generator->sine_lookup_table != NULL && generator->table_size > 0) {
|
||||||
|
// 从查找表获取预计算的值
|
||||||
|
float sine_value = generator->sine_lookup_table[generator->table_index];
|
||||||
|
|
||||||
|
// 更新索引,循环使用查找表
|
||||||
|
generator->table_index = (generator->table_index + 1) % generator->table_size;
|
||||||
|
generator->sample_count++;
|
||||||
|
|
||||||
|
return sine_value;
|
||||||
|
} else {
|
||||||
|
// 如果查找表未初始化,使用实时计算(备用方案)
|
||||||
|
float t = (float)generator->sample_count / generator->sample_rate;
|
||||||
|
float sine_value = generator->amplitude * sinf(2.0f * M_PI * generator->frequency * t);
|
||||||
|
|
||||||
|
// 添加偏置电压
|
||||||
|
float offset = generator->amplitude;
|
||||||
|
sine_value = sine_value + offset;
|
||||||
|
|
||||||
|
// 限制在DAC有效范围内
|
||||||
|
if (sine_value < 0.0f) sine_value = 0.0f;
|
||||||
|
if (sine_value > 2.048f) sine_value = 2.048f;
|
||||||
|
|
||||||
|
generator->sample_count++;
|
||||||
|
return sine_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成正弦波查找表
|
||||||
|
void sine_generator_generate_lookup_table(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
// 释放旧的查找表
|
||||||
|
sine_generator_free_lookup_table(generator);
|
||||||
|
|
||||||
|
// 计算查找表大小:一个完整周期的样本数
|
||||||
|
// 表大小 = 采样率 / 正弦波频率
|
||||||
|
generator->table_size = (uint32_t)(generator->sample_rate / generator->frequency);
|
||||||
|
|
||||||
|
// 确保表大小至少为1
|
||||||
|
if (generator->table_size < 1) {
|
||||||
|
generator->table_size = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分配内存
|
||||||
|
generator->sine_lookup_table = (float*)malloc(generator->table_size * sizeof(float));
|
||||||
|
if (generator->sine_lookup_table == NULL) {
|
||||||
|
ESP_LOGE("SINE_GEN", "Failed to allocate memory for sine lookup table");
|
||||||
|
generator->table_size = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 预计算正弦波值
|
||||||
|
for (uint32_t i = 0; i < generator->table_size; i++) {
|
||||||
|
// 计算时间点
|
||||||
|
float t = (float)i / generator->sample_rate;
|
||||||
|
|
||||||
|
// 计算正弦波值
|
||||||
|
float sine_value = generator->amplitude * sinf(2.0f * M_PI * generator->frequency * t);
|
||||||
|
|
||||||
|
// 添加偏置电压
|
||||||
|
float offset = generator->amplitude;
|
||||||
|
sine_value = sine_value + offset;
|
||||||
|
|
||||||
|
// 限制在DAC有效范围内
|
||||||
|
if (sine_value < 0.0f) sine_value = 0.0f;
|
||||||
|
if (sine_value > 2.048f) sine_value = 2.048f;
|
||||||
|
|
||||||
|
generator->sine_lookup_table[i] = sine_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置索引
|
||||||
|
generator->table_index = 0;
|
||||||
|
|
||||||
|
ESP_LOGI("SINE_GEN", "Generated sine lookup table: %u points, %.1f Hz",
|
||||||
|
generator->table_size, generator->frequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 释放正弦波查找表
|
||||||
|
void sine_generator_free_lookup_table(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
if (generator->sine_lookup_table != NULL) {
|
||||||
|
free(generator->sine_lookup_table);
|
||||||
|
generator->sine_lookup_table = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
generator->table_size = 0;
|
||||||
|
generator->table_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清理生成器(释放所有资源)
|
||||||
|
void sine_generator_cleanup(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
generator->is_running = false;
|
||||||
|
sine_generator_free_lookup_table(generator);
|
||||||
|
|
||||||
|
ESP_LOGI("SINE_GEN", "Sine generator cleaned up");
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
idf_component_register(SRCS "esp32_s3_szp.c" "main.c" "app_ui.c"
|
idf_component_register(SRCS "esp32_s3_szp.c" "main.c" "app_ui.c"
|
||||||
SRCS "assets/font_alipuhui20.c"
|
SRCS "assets/font_alipuhui20.c"
|
||||||
SRCS "bt/ble_hidd_demo.c" "bt/esp_hidd_prf_api.c" "bt/hid_dev.c" "bt/hid_device_le_prf.c"
|
SRCS "bt/ble_hidd_demo.c" "bt/esp_hidd_prf_api.c" "bt/hid_dev.c" "bt/hid_device_le_prf.c"
|
||||||
SRCS "ecg_generator.c"
|
|
||||||
EMBED_FILES "sword.pcm"
|
EMBED_FILES "sword.pcm"
|
||||||
INCLUDE_DIRS "."
|
INCLUDE_DIRS "."
|
||||||
INCLUDE_DIRS "bt")
|
INCLUDE_DIRS "bt"
|
||||||
|
REQUIRES signal_generators bt spiffs esp_wifi nvs_flash fatfs)
|
||||||
|
|
||||||
target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-unused-const-variable)
|
target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-unused-const-variable)
|
||||||
|
|
|
||||||
167
main/main.c
167
main/main.c
|
|
@ -4,92 +4,153 @@
|
||||||
#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;
|
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";
|
||||||
|
|
||||||
// ECG定时器相关
|
// 信号生成器相关
|
||||||
static ecg_generator_t g_ecg_gen;
|
static ecg_generator_t g_ecg_gen;
|
||||||
static esp_timer_handle_t ecg_timer = NULL;
|
static sine_generator_t g_sine_gen;
|
||||||
static uint32_t ecg_sample_count = 0;
|
static esp_timer_handle_t signal_timer = NULL;
|
||||||
static uint32_t ecg_last_log_time = 0;
|
static uint32_t signal_sample_count = 0;
|
||||||
|
static uint32_t signal_last_log_time = 0;
|
||||||
|
static bool use_sine_wave = true; // true=正弦波, false=ECG
|
||||||
|
|
||||||
// ECG定时器回调函数
|
// 信号生成器定时器回调函数
|
||||||
static void ecg_timer_callback(void* arg) {
|
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);
|
||||||
|
} else {
|
||||||
// 生成ECG样本
|
// 生成ECG样本
|
||||||
float ecg_voltage = ecg_generator_get_next_sample(&g_ecg_gen);
|
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen);
|
||||||
|
}
|
||||||
|
|
||||||
// 输出到DAC通道2
|
// 输出到DAC通道2
|
||||||
set_channel_voltage(2, ecg_voltage);
|
set_channel_voltage(2, signal_voltage);
|
||||||
|
|
||||||
ecg_sample_count++;
|
signal_sample_count++;
|
||||||
|
|
||||||
// 每秒输出一次统计信息
|
// 减少日志输出频率,避免影响高频中断性能
|
||||||
uint32_t now = esp_timer_get_time() / 1000; // 转换为毫秒
|
// 每20000个样本输出一次统计信息(约1秒)
|
||||||
if (now - ecg_last_log_time >= 1000) {
|
if (signal_sample_count >= 20000) {
|
||||||
ESP_LOGI(TAG, "ECG Timer: %u samples in 1s (%.1f Hz)",
|
ESP_LOGI(TAG, "Generated %u samples at 20kHz (%s)",
|
||||||
ecg_sample_count, (float)ecg_sample_count);
|
signal_sample_count, use_sine_wave ? "Sine Wave" : "ECG");
|
||||||
ecg_sample_count = 0;
|
signal_sample_count = 0;
|
||||||
ecg_last_log_time = now;
|
signal_last_log_time = esp_timer_get_time() / 1000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 函数声明
|
// 函数声明
|
||||||
void displayMemoryUsage(void);
|
void displayMemoryUsage(void);
|
||||||
void test_ecg_generation(void);
|
void test_signal_generation(void);
|
||||||
|
void switch_to_ecg_mode(void);
|
||||||
|
void switch_to_sine_mode(void);
|
||||||
|
|
||||||
// ECG测试函数
|
// 信号生成器测试函数
|
||||||
void test_ecg_generation(void) {
|
void test_signal_generation(void) {
|
||||||
ESP_LOGI(TAG, "=== ECG Generation Test ===");
|
ESP_LOGI(TAG, "=== Signal Generation Test ===");
|
||||||
|
|
||||||
// 初始化ECG生成器
|
// 初始化ECG生成器
|
||||||
ecg_generator_init(&g_ecg_gen, 250.0f); // 250Hz采样率
|
ecg_generator_init(&g_ecg_gen, 20000.0f); // 20kHz生成率
|
||||||
|
ecg_param_set(&g_ecg_gen, 5.0f, 75.0f);
|
||||||
|
|
||||||
// 设置ECG参数
|
// 初始化正弦波生成器
|
||||||
ecg_generator_set_heart_rate(&g_ecg_gen, 75.0f); // 75次/分
|
sine_generator_init(&g_sine_gen, 20000.0f); // 20kHz生成率
|
||||||
ecg_generator_set_amplitude(&g_ecg_gen, 5.0f); // 直接设置5mV幅值,内部自动转换
|
sine_generator_set_frequency(&g_sine_gen, 10.0f); // 100Hz正弦波
|
||||||
|
sine_generator_set_amplitude(&g_sine_gen, 5.0f); // 5mV
|
||||||
// 幅值设置说明:
|
|
||||||
// ecg_generator_set_amplitude() 现在直接接受mV值
|
|
||||||
// 内部自动处理硬件衰减系数转换
|
|
||||||
// 例如:set_amplitude(5.0f) → 示波器显示5mV
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "ECG Parameters:");
|
|
||||||
ESP_LOGI(TAG, " Heart Rate: %.1f BPM", g_ecg_gen.heart_rate);
|
|
||||||
ESP_LOGI(TAG, " Amplitude: %.1f V", g_ecg_gen.amplitude);
|
|
||||||
ESP_LOGI(TAG, " Sample Rate: %.1f Hz", g_ecg_gen.sample_rate);
|
|
||||||
|
|
||||||
// 创建定时器配置
|
// 创建定时器配置
|
||||||
const esp_timer_create_args_t timer_args = {
|
const esp_timer_create_args_t timer_args = {
|
||||||
.callback = &ecg_timer_callback,
|
.callback = &signal_timer_callback,
|
||||||
.name = "ecg_timer"
|
.name = "signal_timer"
|
||||||
};
|
};
|
||||||
|
|
||||||
// 创建定时器
|
// 创建定时器
|
||||||
esp_err_t ret = esp_timer_create(&timer_args, &ecg_timer);
|
esp_err_t ret = esp_timer_create(&timer_args, &signal_timer);
|
||||||
if (ret != ESP_OK) {
|
if (ret != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Failed to create ECG timer: %s", esp_err_to_name(ret));
|
ESP_LOGE(TAG, "Failed to create signal timer: %s", esp_err_to_name(ret));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 启动ECG生成器
|
// 启动信号生成器
|
||||||
|
if (use_sine_wave) {
|
||||||
|
sine_generator_start(&g_sine_gen);
|
||||||
|
ESP_LOGI(TAG, "Started sine wave generator: 100Hz, 5mV");
|
||||||
|
} else {
|
||||||
ecg_generator_start(&g_ecg_gen);
|
ecg_generator_start(&g_ecg_gen);
|
||||||
|
ESP_LOGI(TAG, "Started ECG generator: 75 BPM, 5mV");
|
||||||
|
}
|
||||||
|
|
||||||
// 启动定时器 (4ms = 250Hz)
|
// 启动定时器 (50us = 20kHz)
|
||||||
ret = esp_timer_start_periodic(ecg_timer, 4000); // 4000微秒 = 4ms
|
ret = esp_timer_start_periodic(signal_timer, 50); // 50微秒 = 20kHz
|
||||||
if (ret != ESP_OK) {
|
if (ret != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Failed to start ECG timer: %s", esp_err_to_name(ret));
|
ESP_LOGE(TAG, "Failed to start signal timer: %s", esp_err_to_name(ret));
|
||||||
esp_timer_delete(ecg_timer);
|
esp_timer_delete(signal_timer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP_LOGI(TAG, "ECG timer started at 250Hz (4ms period)");
|
ESP_LOGI(TAG, "Signal timer started at 20kHz (50us period)");
|
||||||
ESP_LOGI(TAG, "ECG generation is now running...");
|
}
|
||||||
|
|
||||||
|
// 切换到ECG模式
|
||||||
|
void switch_to_ecg_mode(void) {
|
||||||
|
if (use_sine_wave) {
|
||||||
|
sine_generator_stop(&g_sine_gen);
|
||||||
|
ecg_generator_start(&g_ecg_gen);
|
||||||
|
use_sine_wave = false;
|
||||||
|
ESP_LOGI(TAG, "Switched to ECG mode");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 切换到正弦波模式
|
||||||
|
void switch_to_sine_mode(void) {
|
||||||
|
if (!use_sine_wave) {
|
||||||
|
ecg_generator_stop(&g_ecg_gen);
|
||||||
|
sine_generator_start(&g_sine_gen);
|
||||||
|
use_sine_wave = true;
|
||||||
|
ESP_LOGI(TAG, "Switched to sine wave mode");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按键初始化
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 打印内存使用情况
|
// 打印内存使用情况
|
||||||
|
|
@ -123,18 +184,28 @@ void app_main(void)
|
||||||
bsp_i2c_init(); // I2C初始化
|
bsp_i2c_init(); // I2C初始化
|
||||||
LED_init(); // LED初始化
|
LED_init(); // LED初始化
|
||||||
init_ad5328(); // DAC初始化
|
init_ad5328(); // DAC初始化
|
||||||
|
button_init(); // 按键初始化
|
||||||
my_event_group = xEventGroupCreate();
|
my_event_group = xEventGroupCreate();
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Hardware initialization completed.");
|
ESP_LOGI(TAG, "Hardware initialization completed.");
|
||||||
|
|
||||||
// 启动ECG生成
|
// 启动信号生成
|
||||||
test_ecg_generation();
|
test_signal_generation();
|
||||||
|
|
||||||
// LED状态指示
|
// LED状态指示
|
||||||
ESP_LOGI(TAG, "Starting LED status indicator...");
|
ESP_LOGI(TAG, "Starting LED status indicator...");
|
||||||
int led_count = 0;
|
int led_count = 0;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
// 检测按键按下
|
||||||
|
if (button_pressed()) {
|
||||||
|
if (use_sine_wave) {
|
||||||
|
switch_to_ecg_mode();
|
||||||
|
} else {
|
||||||
|
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));
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
idf_component_register(
|
||||||
|
SRCS
|
||||||
|
"src/ecg_generator.c"
|
||||||
|
"src/sine_generator.c"
|
||||||
|
INCLUDE_DIRS
|
||||||
|
"include"
|
||||||
|
REQUIRES
|
||||||
|
esp_log
|
||||||
|
math
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
# Signal Generators Library
|
||||||
|
|
||||||
|
这是一个ESP32信号生成器库,包含ECG(心电图)生成器和正弦波生成器。
|
||||||
|
|
||||||
|
## 功能特性
|
||||||
|
|
||||||
|
### ECG生成器 (ecg_generator)
|
||||||
|
- 生成逼真的心电图信号
|
||||||
|
- 可调节心率和幅度
|
||||||
|
- 包含P波、QRS波群、T波
|
||||||
|
- 支持实时参数调整
|
||||||
|
|
||||||
|
### 正弦波生成器 (sine_generator)
|
||||||
|
- 高频正弦波生成
|
||||||
|
- 预计算查找表优化
|
||||||
|
- 支持50kHz采样率
|
||||||
|
- 内存高效设计
|
||||||
|
|
||||||
|
## 使用方法
|
||||||
|
|
||||||
|
### ECG生成器
|
||||||
|
```c
|
||||||
|
#include "ecg_generator.h"
|
||||||
|
|
||||||
|
ecg_generator_t ecg_gen;
|
||||||
|
ecg_generator_init(&ecg_gen, 250.0f); // 250Hz采样率
|
||||||
|
ecg_generator_set_heart_rate(&ecg_gen, 75.0f); // 75 BPM
|
||||||
|
ecg_generator_set_amplitude(&ecg_gen, 5.0f); // 5mV
|
||||||
|
ecg_generator_start(&ecg_gen);
|
||||||
|
|
||||||
|
// 在定时器回调中
|
||||||
|
float sample = ecg_generator_get_next_sample(&ecg_gen);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 正弦波生成器
|
||||||
|
```c
|
||||||
|
#include "sine_generator.h"
|
||||||
|
|
||||||
|
sine_generator_t sine_gen;
|
||||||
|
sine_generator_init(&sine_gen, 50000.0f); // 50kHz采样率
|
||||||
|
sine_generator_set_frequency(&sine_gen, 200.0f); // 200Hz
|
||||||
|
sine_generator_set_amplitude(&sine_gen, 5.0f); // 5mV
|
||||||
|
sine_generator_start(&sine_gen);
|
||||||
|
|
||||||
|
// 在定时器回调中
|
||||||
|
float sample = sine_generator_get_next_sample(&sine_gen);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 性能优化
|
||||||
|
|
||||||
|
- ECG生成器:实时计算,适合低频应用
|
||||||
|
- 正弦波生成器:预计算查找表,适合高频应用
|
||||||
|
- 内存管理:自动分配和释放查找表
|
||||||
|
- 中断友好:最小化中断执行时间
|
||||||
|
|
||||||
|
## 依赖项
|
||||||
|
|
||||||
|
- ESP-IDF
|
||||||
|
- math库
|
||||||
|
- esp_log库
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
## IDF Component Manager Manifest File
|
||||||
|
dependencies:
|
||||||
|
esp_log: "*"
|
||||||
|
math: "*"
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
#ifndef ECG_GENERATOR_H
|
||||||
|
#define ECG_GENERATOR_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ECG生成器结构体
|
||||||
|
typedef struct {
|
||||||
|
// 用户可调参数
|
||||||
|
float heart_rate; // 心率 (次/分)
|
||||||
|
float amplitude; // 幅值 (V)
|
||||||
|
|
||||||
|
// 内部状态
|
||||||
|
uint32_t sample_count; // 样本计数器
|
||||||
|
float sample_rate; // 采样率 (Hz)
|
||||||
|
bool is_running; // 是否正在运行
|
||||||
|
|
||||||
|
// 固定波形参数 (保持正常ECG比例)
|
||||||
|
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波幅度比例
|
||||||
|
|
||||||
|
// 固定时间参数 (保持正常ECG时序)
|
||||||
|
float p_width; // P波宽度
|
||||||
|
float qrs_width; // QRS波群宽度
|
||||||
|
float t_width; // T波宽度
|
||||||
|
|
||||||
|
// 预计算ECG查找表
|
||||||
|
float* ecg_lookup_table; // ECG查找表
|
||||||
|
uint32_t table_size; // 查找表大小
|
||||||
|
uint32_t table_index; // 当前索引
|
||||||
|
} ecg_generator_t;
|
||||||
|
|
||||||
|
// 函数声明
|
||||||
|
void ecg_generator_init(ecg_generator_t *generator, float sample_rate);
|
||||||
|
void ecg_generator_set_heart_rate(ecg_generator_t *generator, float heart_rate);
|
||||||
|
void ecg_generator_set_amplitude(ecg_generator_t *generator, float amplitude_mv); // 直接输入mV值,内部自动转换
|
||||||
|
void ecg_generator_start(ecg_generator_t *generator);
|
||||||
|
void ecg_generator_stop(ecg_generator_t *generator);
|
||||||
|
void ecg_generator_reset(ecg_generator_t *generator);
|
||||||
|
float ecg_generator_get_next_sample(ecg_generator_t *generator);
|
||||||
|
void ecg_generator_generate_lookup_table(ecg_generator_t *generator);
|
||||||
|
void ecg_generator_free_lookup_table(ecg_generator_t *generator);
|
||||||
|
void ecg_generator_cleanup(ecg_generator_t *generator);
|
||||||
|
void ecg_param_set(ecg_generator_t *generator, float amplitude_mv, float heart_rate);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // ECG_GENERATOR_H
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
#ifndef SINE_GENERATOR_H
|
||||||
|
#define SINE_GENERATOR_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 正弦波生成器结构体
|
||||||
|
typedef struct {
|
||||||
|
// 用户可调参数
|
||||||
|
float frequency; // 正弦波频率 (Hz)
|
||||||
|
float amplitude; // 幅值 (V)
|
||||||
|
|
||||||
|
// 内部状态
|
||||||
|
uint32_t sample_count; // 样本计数器
|
||||||
|
float sample_rate; // 采样率 (Hz)
|
||||||
|
bool is_running; // 是否正在运行
|
||||||
|
|
||||||
|
// 预计算正弦波查找表
|
||||||
|
float* sine_lookup_table; // 正弦波查找表
|
||||||
|
uint32_t table_size; // 查找表大小
|
||||||
|
uint32_t table_index; // 当前索引
|
||||||
|
} sine_generator_t;
|
||||||
|
|
||||||
|
// 函数声明
|
||||||
|
void sine_generator_init(sine_generator_t *generator, float sample_rate);
|
||||||
|
void sine_generator_set_frequency(sine_generator_t *generator, float frequency);
|
||||||
|
void sine_generator_set_amplitude(sine_generator_t *generator, float amplitude_mv);
|
||||||
|
void sine_generator_start(sine_generator_t *generator);
|
||||||
|
void sine_generator_stop(sine_generator_t *generator);
|
||||||
|
void sine_generator_reset(sine_generator_t *generator);
|
||||||
|
float sine_generator_get_next_sample(sine_generator_t *generator);
|
||||||
|
void sine_generator_cleanup(sine_generator_t *generator);
|
||||||
|
|
||||||
|
// 查找表管理函数
|
||||||
|
void sine_generator_generate_lookup_table(sine_generator_t *generator);
|
||||||
|
void sine_generator_free_lookup_table(sine_generator_t *generator);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // SINE_GENERATOR_H
|
||||||
|
|
@ -0,0 +1,274 @@
|
||||||
|
#include "ecg_generator.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "esp_log.h"
|
||||||
|
|
||||||
|
// 初始化ECG生成器
|
||||||
|
void ecg_generator_init(ecg_generator_t *generator, float sample_rate) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
memset(generator, 0, sizeof(ecg_generator_t));
|
||||||
|
|
||||||
|
// 设置默认参数
|
||||||
|
generator->heart_rate = 75.0f; // 心率75次/分
|
||||||
|
generator->amplitude = 1.0f; // 幅值1.0mV
|
||||||
|
generator->sample_rate = sample_rate;
|
||||||
|
generator->is_running = false;
|
||||||
|
|
||||||
|
// 固定波形参数 (保持正常ECG比例)
|
||||||
|
generator->p_amp_ratio = 0.2f; // P波幅度比例
|
||||||
|
generator->q_amp_ratio = 0.3f; // Q波幅度比例
|
||||||
|
generator->r_amp_ratio = 1.0f; // R波幅度比例
|
||||||
|
generator->s_amp_ratio = 0.4f; // S波幅度比例
|
||||||
|
generator->t_amp_ratio = 0.4f; // T波幅度比例
|
||||||
|
|
||||||
|
// 固定时间参数 (保持正常ECG时序)
|
||||||
|
generator->p_width = 0.03f; // P波宽度
|
||||||
|
generator->qrs_width = 0.01f; // QRS波群宽度
|
||||||
|
generator->t_width = 0.05f; // T波宽度
|
||||||
|
|
||||||
|
// 初始化查找表
|
||||||
|
generator->ecg_lookup_table = NULL;
|
||||||
|
generator->table_size = 0;
|
||||||
|
generator->table_index = 0;
|
||||||
|
|
||||||
|
// 生成初始查找表
|
||||||
|
ecg_generator_generate_lookup_table(generator);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ecg_param_set(ecg_generator_t *generator, float amplitude_mv, float heart_rate) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
ecg_generator_set_heart_rate(generator, heart_rate);
|
||||||
|
ecg_generator_set_amplitude(generator, amplitude_mv);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置心率
|
||||||
|
void ecg_generator_set_heart_rate(ecg_generator_t *generator, float heart_rate) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
// 限制心率范围
|
||||||
|
if (heart_rate < 30.0f) heart_rate = 30.0f;
|
||||||
|
if (heart_rate > 200.0f) heart_rate = 200.0f;
|
||||||
|
|
||||||
|
generator->heart_rate = heart_rate;
|
||||||
|
|
||||||
|
// 心率改变时重新生成查找表
|
||||||
|
ecg_generator_generate_lookup_table(generator);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置幅值(直接输入mV值,内部自动转换为DAC输出值)
|
||||||
|
void ecg_generator_set_amplitude(ecg_generator_t *generator, float amplitude_mv) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
// 硬件衰减系数:约38倍 (根据实际测量:0.132V → 5mV)
|
||||||
|
// 对应关系:amplitude(V) × 38 ≈ 示波器显示值(mV)
|
||||||
|
const float attenuation_factor = 38.0f;
|
||||||
|
|
||||||
|
// 将mV除以衰减系数得到DAC输出值
|
||||||
|
float dac_amplitude = amplitude_mv / attenuation_factor;
|
||||||
|
|
||||||
|
generator->amplitude = dac_amplitude;
|
||||||
|
|
||||||
|
// 幅值改变时重新生成查找表
|
||||||
|
ecg_generator_generate_lookup_table(generator);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 开始生成
|
||||||
|
void ecg_generator_start(ecg_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
generator->is_running = true;
|
||||||
|
generator->sample_count = 0;
|
||||||
|
generator->table_index = 0; // 重置查找表索引
|
||||||
|
}
|
||||||
|
|
||||||
|
// 停止生成
|
||||||
|
void ecg_generator_stop(ecg_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
generator->is_running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置生成器
|
||||||
|
void ecg_generator_reset(ecg_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
generator->sample_count = 0;
|
||||||
|
generator->table_index = 0; // 重置查找表索引
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取下一个样本 - 使用查找表优化
|
||||||
|
float ecg_generator_get_next_sample(ecg_generator_t *generator) {
|
||||||
|
if (generator == NULL || !generator->is_running) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (generator->ecg_lookup_table != NULL && generator->table_size > 0) {
|
||||||
|
// 使用查找表
|
||||||
|
float ecg_value = generator->ecg_lookup_table[generator->table_index];
|
||||||
|
generator->table_index = (generator->table_index + 1) % generator->table_size;
|
||||||
|
generator->sample_count++;
|
||||||
|
return ecg_value;
|
||||||
|
} else {
|
||||||
|
// 查找表未准备好,使用实时计算(备用方案)
|
||||||
|
return ecg_generator_calculate_sample_realtime(generator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 实时计算ECG样本(备用方案)
|
||||||
|
float ecg_generator_calculate_sample_realtime(ecg_generator_t *generator) {
|
||||||
|
// 计算RR间期 (秒)
|
||||||
|
float rr_interval = 60.0f / generator->heart_rate;
|
||||||
|
|
||||||
|
// 计算当前时间
|
||||||
|
float t = (float)generator->sample_count / generator->sample_rate;
|
||||||
|
|
||||||
|
// 周期内时间
|
||||||
|
float t_mod = fmodf(t, rr_interval);
|
||||||
|
|
||||||
|
// 归一化时间到0-1范围(相对于RR间期的比例)
|
||||||
|
float t_norm = t_mod / rr_interval;
|
||||||
|
|
||||||
|
// 计算各波幅度
|
||||||
|
float p_amp = generator->amplitude * generator->p_amp_ratio;
|
||||||
|
float q_amp = generator->amplitude * generator->q_amp_ratio;
|
||||||
|
float r_amp = generator->amplitude * generator->r_amp_ratio;
|
||||||
|
float s_amp = generator->amplitude * generator->s_amp_ratio;
|
||||||
|
float t_amp = generator->amplitude * generator->t_amp_ratio;
|
||||||
|
|
||||||
|
// 时间参数(相对于RR间期的比例) - 根据Python代码修正
|
||||||
|
float p_time_ratio = 0.125f; // P波位置:12.5%
|
||||||
|
float q_time_ratio = 0.3125f; // Q波位置:31.25%
|
||||||
|
float r_time_ratio = 0.3375f; // R波位置:33.75%
|
||||||
|
float s_time_ratio = 0.3625f; // S波位置:36.25%
|
||||||
|
float t_time_ratio = 0.625f; // T波位置:62.5%
|
||||||
|
|
||||||
|
// 宽度参数(相对于RR间期的比例) - 修正QRS宽度使其充分重叠
|
||||||
|
float p_width_ratio = 0.0375f; // P波宽度:0.03/0.8 = 3.75%
|
||||||
|
float qrs_width_ratio = 0.0125f; // QRS宽度:增加到2.5%,确保Q、R、S充分重叠
|
||||||
|
float t_width_ratio = 0.0625f; // T波宽度:0.05/0.8 = 6.25%
|
||||||
|
|
||||||
|
// P波 - 修正后的计算
|
||||||
|
float p = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) / (2.0f * p_width_ratio * p_width_ratio));
|
||||||
|
|
||||||
|
// QRS波群 - 修正后的计算
|
||||||
|
float q = -q_amp * expf(-(t_norm - q_time_ratio) * (t_norm - q_time_ratio) / (2.0f * qrs_width_ratio * qrs_width_ratio));
|
||||||
|
float r = r_amp * expf(-(t_norm - r_time_ratio) * (t_norm - r_time_ratio) / (2.0f * qrs_width_ratio * qrs_width_ratio));
|
||||||
|
float s = -s_amp * expf(-(t_norm - s_time_ratio) * (t_norm - s_time_ratio) / (2.0f * qrs_width_ratio * qrs_width_ratio));
|
||||||
|
float qrs = q + r + s;
|
||||||
|
|
||||||
|
// T波 - 修正后的计算
|
||||||
|
float t_wave = t_amp * expf(-(t_norm - t_time_ratio) * (t_norm - t_time_ratio) / (2.0f * t_width_ratio * t_width_ratio));
|
||||||
|
|
||||||
|
// 组合波形
|
||||||
|
float ecg_value = p + qrs + t_wave;
|
||||||
|
|
||||||
|
// 添加偏置电压,将ECG波形平移到DAC有效范围
|
||||||
|
float offset = generator->amplitude; // 偏置电压
|
||||||
|
ecg_value = ecg_value + offset;
|
||||||
|
|
||||||
|
// 限制在DAC有效范围内 (0V 到 2.048V)
|
||||||
|
if (ecg_value < 0.0f) ecg_value = 0.0f;
|
||||||
|
if (ecg_value > 2.048f) ecg_value = 2.048f;
|
||||||
|
|
||||||
|
generator->sample_count++;
|
||||||
|
return ecg_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成ECG查找表
|
||||||
|
void ecg_generator_generate_lookup_table(ecg_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
// 释放旧的查找表
|
||||||
|
ecg_generator_free_lookup_table(generator);
|
||||||
|
|
||||||
|
// 计算查找表大小:一个完整RR间期的样本数
|
||||||
|
// 表大小 = 生成率 / 心率频率
|
||||||
|
float heart_rate_freq = generator->heart_rate / 60.0f; // 转换为Hz
|
||||||
|
generator->table_size = (uint32_t)(generator->sample_rate / heart_rate_freq);
|
||||||
|
|
||||||
|
// 确保表大小至少为1
|
||||||
|
if (generator->table_size < 1) {
|
||||||
|
generator->table_size = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分配内存
|
||||||
|
generator->ecg_lookup_table = (float*)malloc(generator->table_size * sizeof(float));
|
||||||
|
if (generator->ecg_lookup_table == NULL) {
|
||||||
|
ESP_LOGE("ECG_GEN", "Failed to allocate memory for ECG lookup table");
|
||||||
|
generator->table_size = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 预计算ECG波形值
|
||||||
|
for (uint32_t i = 0; i < generator->table_size; i++) {
|
||||||
|
// 计算归一化时间 (0-1)
|
||||||
|
float t_norm = (float)i / generator->table_size;
|
||||||
|
|
||||||
|
// 计算各波幅度
|
||||||
|
float p_amp = generator->amplitude * generator->p_amp_ratio;
|
||||||
|
float q_amp = generator->amplitude * generator->q_amp_ratio;
|
||||||
|
float r_amp = generator->amplitude * generator->r_amp_ratio;
|
||||||
|
float s_amp = generator->amplitude * generator->s_amp_ratio;
|
||||||
|
float t_amp = generator->amplitude * generator->t_amp_ratio;
|
||||||
|
|
||||||
|
// 时间参数(相对于RR间期的比例)
|
||||||
|
float p_time_ratio = 0.125f; // P波位置:12.5%
|
||||||
|
float q_time_ratio = 0.3125f; // Q波位置:31.25%
|
||||||
|
float r_time_ratio = 0.3375f; // R波位置:33.75%
|
||||||
|
float s_time_ratio = 0.3625f; // S波位置:36.25%
|
||||||
|
float t_time_ratio = 0.625f; // T波位置:62.5%
|
||||||
|
|
||||||
|
// 宽度参数(相对于RR间期的比例)
|
||||||
|
float p_width_ratio = 0.0375f; // P波宽度:3.75%
|
||||||
|
float qrs_width_ratio = 0.0125f; // QRS宽度:1.25%
|
||||||
|
float t_width_ratio = 0.0625f; // T波宽度:6.25%
|
||||||
|
|
||||||
|
// P波计算
|
||||||
|
float p = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) / (2.0f * p_width_ratio * p_width_ratio));
|
||||||
|
|
||||||
|
// QRS波群计算
|
||||||
|
float q = -q_amp * expf(-(t_norm - q_time_ratio) * (t_norm - q_time_ratio) / (2.0f * qrs_width_ratio * qrs_width_ratio));
|
||||||
|
float r = r_amp * expf(-(t_norm - r_time_ratio) * (t_norm - r_time_ratio) / (2.0f * qrs_width_ratio * qrs_width_ratio));
|
||||||
|
float s = -s_amp * expf(-(t_norm - s_time_ratio) * (t_norm - s_time_ratio) / (2.0f * qrs_width_ratio * qrs_width_ratio));
|
||||||
|
float qrs = q + r + s;
|
||||||
|
|
||||||
|
// T波计算
|
||||||
|
float t_wave = t_amp * expf(-(t_norm - t_time_ratio) * (t_norm - t_time_ratio) / (2.0f * t_width_ratio * t_width_ratio));
|
||||||
|
|
||||||
|
// 组合波形
|
||||||
|
float ecg_value = p + qrs + t_wave;
|
||||||
|
|
||||||
|
// 添加偏置电压
|
||||||
|
float offset = generator->amplitude;
|
||||||
|
ecg_value = ecg_value + offset;
|
||||||
|
|
||||||
|
// 限制在DAC有效范围内
|
||||||
|
if (ecg_value < 0.0f) ecg_value = 0.0f;
|
||||||
|
if (ecg_value > 2.048f) ecg_value = 2.048f;
|
||||||
|
|
||||||
|
generator->ecg_lookup_table[i] = ecg_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
generator->table_index = 0; // 重置索引
|
||||||
|
ESP_LOGI("ECG_GEN", "Generated ECG lookup table: %u points, %.1f BPM", generator->table_size, generator->heart_rate);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 释放ECG查找表
|
||||||
|
void ecg_generator_free_lookup_table(ecg_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
if (generator->ecg_lookup_table != NULL) {
|
||||||
|
free(generator->ecg_lookup_table);
|
||||||
|
generator->ecg_lookup_table = NULL;
|
||||||
|
}
|
||||||
|
generator->table_size = 0;
|
||||||
|
generator->table_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清理ECG生成器
|
||||||
|
void ecg_generator_cleanup(ecg_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
ecg_generator_stop(generator);
|
||||||
|
ecg_generator_free_lookup_table(generator);
|
||||||
|
ESP_LOGI("ECG_GEN", "ECG generator cleaned up.");
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,199 @@
|
||||||
|
#include "sine_generator.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "esp_log.h"
|
||||||
|
|
||||||
|
// 初始化正弦波生成器
|
||||||
|
void sine_generator_init(sine_generator_t *generator, float sample_rate) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
memset(generator, 0, sizeof(sine_generator_t));
|
||||||
|
|
||||||
|
// 设置默认参数
|
||||||
|
generator->frequency = 200.0f; // 默认200Hz正弦波
|
||||||
|
generator->amplitude = 1.0f; // 幅值1.0V
|
||||||
|
generator->sample_rate = sample_rate;
|
||||||
|
generator->is_running = false;
|
||||||
|
|
||||||
|
// 查找表参数
|
||||||
|
generator->sine_lookup_table = NULL;
|
||||||
|
generator->table_size = 0;
|
||||||
|
generator->table_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置正弦波频率
|
||||||
|
void sine_generator_set_frequency(sine_generator_t *generator, float frequency) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
// 限制频率范围
|
||||||
|
if (frequency < 0.1f) frequency = 0.1f;
|
||||||
|
if (frequency > 10000.0f) frequency = 10000.0f;
|
||||||
|
|
||||||
|
generator->frequency = frequency;
|
||||||
|
|
||||||
|
// 如果已经运行,重新生成查找表
|
||||||
|
if (generator->is_running) {
|
||||||
|
sine_generator_generate_lookup_table(generator);
|
||||||
|
}
|
||||||
|
|
||||||
|
ESP_LOGI("SINE_GEN", "Sine wave frequency set to: %.1f Hz", frequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置幅值(直接输入mV值,内部自动转换为DAC输出值)
|
||||||
|
void sine_generator_set_amplitude(sine_generator_t *generator, float amplitude_mv) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
// 硬件衰减系数:约38倍 (根据实际测量:0.132V → 5mV)
|
||||||
|
// 对应关系:amplitude(V) × 38 ≈ 示波器显示值(mV)
|
||||||
|
const float attenuation_factor = 38.0f;
|
||||||
|
|
||||||
|
// 将mV除以衰减系数得到DAC输出值
|
||||||
|
float dac_amplitude = amplitude_mv / attenuation_factor;
|
||||||
|
|
||||||
|
generator->amplitude = dac_amplitude;
|
||||||
|
|
||||||
|
// 如果已经运行,重新生成查找表
|
||||||
|
if (generator->is_running) {
|
||||||
|
sine_generator_generate_lookup_table(generator);
|
||||||
|
}
|
||||||
|
|
||||||
|
ESP_LOGI("SINE_GEN", "Sine wave amplitude set to: %.1f mV", amplitude_mv);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 开始生成
|
||||||
|
void sine_generator_start(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
generator->is_running = true;
|
||||||
|
generator->sample_count = 0;
|
||||||
|
|
||||||
|
// 生成查找表
|
||||||
|
sine_generator_generate_lookup_table(generator);
|
||||||
|
|
||||||
|
ESP_LOGI("SINE_GEN", "Sine generator started: %.1f Hz, %.1f mV",
|
||||||
|
generator->frequency, generator->amplitude * 38.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 停止生成
|
||||||
|
void sine_generator_stop(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
generator->is_running = false;
|
||||||
|
ESP_LOGI("SINE_GEN", "Sine generator stopped");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置生成器
|
||||||
|
void sine_generator_reset(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
generator->sample_count = 0;
|
||||||
|
generator->table_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取下一个样本
|
||||||
|
float sine_generator_get_next_sample(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL || !generator->is_running) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用预计算的查找表,超高速访问
|
||||||
|
if (generator->sine_lookup_table != NULL && generator->table_size > 0) {
|
||||||
|
// 从查找表获取预计算的值
|
||||||
|
float sine_value = generator->sine_lookup_table[generator->table_index];
|
||||||
|
|
||||||
|
// 更新索引,循环使用查找表
|
||||||
|
generator->table_index = (generator->table_index + 1) % generator->table_size;
|
||||||
|
generator->sample_count++;
|
||||||
|
|
||||||
|
return sine_value;
|
||||||
|
} else {
|
||||||
|
// 如果查找表未初始化,使用实时计算(备用方案)
|
||||||
|
float t = (float)generator->sample_count / generator->sample_rate;
|
||||||
|
float sine_value = generator->amplitude * sinf(2.0f * M_PI * generator->frequency * t);
|
||||||
|
|
||||||
|
// 添加偏置电压
|
||||||
|
float offset = generator->amplitude;
|
||||||
|
sine_value = sine_value + offset;
|
||||||
|
|
||||||
|
// 限制在DAC有效范围内
|
||||||
|
if (sine_value < 0.0f) sine_value = 0.0f;
|
||||||
|
if (sine_value > 2.048f) sine_value = 2.048f;
|
||||||
|
|
||||||
|
generator->sample_count++;
|
||||||
|
return sine_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成正弦波查找表
|
||||||
|
void sine_generator_generate_lookup_table(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
// 释放旧的查找表
|
||||||
|
sine_generator_free_lookup_table(generator);
|
||||||
|
|
||||||
|
// 计算查找表大小:一个完整周期的样本数
|
||||||
|
// 表大小 = 采样率 / 正弦波频率
|
||||||
|
generator->table_size = (uint32_t)(generator->sample_rate / generator->frequency);
|
||||||
|
|
||||||
|
// 确保表大小至少为1
|
||||||
|
if (generator->table_size < 1) {
|
||||||
|
generator->table_size = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分配内存
|
||||||
|
generator->sine_lookup_table = (float*)malloc(generator->table_size * sizeof(float));
|
||||||
|
if (generator->sine_lookup_table == NULL) {
|
||||||
|
ESP_LOGE("SINE_GEN", "Failed to allocate memory for sine lookup table");
|
||||||
|
generator->table_size = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 预计算正弦波值
|
||||||
|
for (uint32_t i = 0; i < generator->table_size; i++) {
|
||||||
|
// 计算时间点
|
||||||
|
float t = (float)i / generator->sample_rate;
|
||||||
|
|
||||||
|
// 计算正弦波值
|
||||||
|
float sine_value = generator->amplitude * sinf(2.0f * M_PI * generator->frequency * t);
|
||||||
|
|
||||||
|
// 添加偏置电压
|
||||||
|
float offset = generator->amplitude;
|
||||||
|
sine_value = sine_value + offset;
|
||||||
|
|
||||||
|
// 限制在DAC有效范围内
|
||||||
|
if (sine_value < 0.0f) sine_value = 0.0f;
|
||||||
|
if (sine_value > 2.048f) sine_value = 2.048f;
|
||||||
|
|
||||||
|
generator->sine_lookup_table[i] = sine_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置索引
|
||||||
|
generator->table_index = 0;
|
||||||
|
|
||||||
|
ESP_LOGI("SINE_GEN", "Generated sine lookup table: %u points, %.1f Hz",
|
||||||
|
generator->table_size, generator->frequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 释放正弦波查找表
|
||||||
|
void sine_generator_free_lookup_table(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
if (generator->sine_lookup_table != NULL) {
|
||||||
|
free(generator->sine_lookup_table);
|
||||||
|
generator->sine_lookup_table = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
generator->table_size = 0;
|
||||||
|
generator->table_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清理生成器(释放所有资源)
|
||||||
|
void sine_generator_cleanup(sine_generator_t *generator) {
|
||||||
|
if (generator == NULL) return;
|
||||||
|
|
||||||
|
generator->is_running = false;
|
||||||
|
sine_generator_free_lookup_table(generator);
|
||||||
|
|
||||||
|
ESP_LOGI("SINE_GEN", "Sine generator cleaned up");
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue