#include #include "esp32_s3_szp.h" #include "app_ui.h" #include #include #include "ecg_generator.h" #include "esp_timer.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" static const char *TAG = "MAIN"; static esp_timer_handle_t signal_timer = NULL; static uint32_t signal_sample_count = 0; static uint32_t signal_last_log_time = 0; // 信号生成器定时器回调函数 static void signal_timer_callback(void* arg) { // ECG十二导联模式:使用十二导联输出函数 ecg_generator_output_twelve_leads(set_channel_voltage); signal_sample_count++; } // 函数声明 void displayMemoryUsage(void); void init_ecg_system(void); void init_hardware(void); // ECG系统初始化函数 void init_ecg_system(void) { ESP_LOGI(TAG, "=== 初始化ECG十二导联系统 ==="); // 使用封装函数初始化所有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 = { .callback = &signal_timer_callback, .name = "signal_timer" }; // 创建定时器 ret = esp_timer_create(&timer_args, &signal_timer); if (ret != 0) { ESP_LOGE(TAG, "Failed to create signal timer"); return; } // 启动定时器 (50us = 20kHz) ret = esp_timer_start_periodic(signal_timer, 50); // 50微秒 = 20kHz if (ret != 0) { ESP_LOGE(TAG, "Failed to start signal timer"); esp_timer_delete(signal_timer); return; } ESP_LOGI(TAG, "ECG系统初始化完成,定时器启动在20kHz (50us周期)"); } void init_hardware(void) { // 硬件初始化 bsp_i2c_init(); // I2C初始化 LED_init(); // LED初始化 init_ad5328(); // DAC初始化 ESP_LOGI(TAG, "Hardware initialization completed."); } // 打印内存使用情况 void displayMemoryUsage() { size_t totalDRAM = heap_caps_get_total_size(MALLOC_CAP_INTERNAL); size_t freeDRAM = heap_caps_get_free_size(MALLOC_CAP_INTERNAL); size_t usedDRAM = totalDRAM - freeDRAM; size_t totalPSRAM = heap_caps_get_total_size(MALLOC_CAP_SPIRAM); size_t freePSRAM = heap_caps_get_free_size(MALLOC_CAP_SPIRAM); size_t usedPSRAM = totalPSRAM - freePSRAM; size_t DRAM_largest_block = heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL); size_t PSRAM_largest_block = heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM); float dramUsagePercentage = (float)usedDRAM / totalDRAM * 100; float psramUsagePercentage = (float)usedPSRAM / totalPSRAM * 100; ESP_LOGI(TAG, "DRAM Total: %zu bytes, Used: %zu bytes, Free: %zu bytes, DRAM_Largest_block: %zu bytes", totalDRAM, usedDRAM, freeDRAM, DRAM_largest_block); ESP_LOGI(TAG, "DRAM Used: %.2f%%", dramUsagePercentage); ESP_LOGI(TAG, "PSRAM Total: %zu bytes, Used: %zu bytes, Free: %zu bytes, PSRAM_Largest_block: %zu bytes", totalPSRAM, usedPSRAM, freePSRAM, PSRAM_largest_block); ESP_LOGI(TAG, "PSRAM Used: %.2f%%", psramUsagePercentage); } // 主函数 void app_main(void) { int led_count = 0; init_hardware(); init_ecg_system(); while (true) { // 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(); } } }