Stimulate/main/main.c

113 lines
3.6 KiB
C
Raw Normal View History

2025-09-25 18:50:48 +08:00
#include <stdio.h>
#include "esp32_s3_szp.h"
#include "app_ui.h"
#include <esp_system.h>
#include <math.h>
#include "ecg_generator.h"
#include "esp_timer.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
2025-09-26 14:16:44 +08:00
2025-09-25 18:50:48 +08:00
static const char *TAG = "MAIN";
2025-09-26 14:16:44 +08:00
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) {
2025-10-09 10:39:54 +08:00
// ECG十二导联模式使用十二导联输出函数
ecg_generator_output_twelve_leads(set_channel_voltage);
2025-09-25 18:50:48 +08:00
2025-09-26 14:16:44 +08:00
signal_sample_count++;
2025-09-25 18:50:48 +08:00
}
// 函数声明
void displayMemoryUsage(void);
2025-10-09 10:39:54 +08:00
void init_ecg_system(void);
void init_hardware(void);
2025-09-25 18:50:48 +08:00
2025-10-09 10:39:54 +08:00
// ECG系统初始化函数
void init_ecg_system(void) {
ESP_LOGI(TAG, "=== 初始化ECG十二导联系统 ===");
2025-09-29 09:35:45 +08:00
2025-10-09 10:39:54 +08:00
// 使用封装函数初始化所有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;
}
2025-09-25 18:50:48 +08:00
// 创建定时器配置
const esp_timer_create_args_t timer_args = {
2025-09-26 14:16:44 +08:00
.callback = &signal_timer_callback,
.name = "signal_timer"
2025-09-25 18:50:48 +08:00
};
// 创建定时器
2025-10-09 10:39:54 +08:00
ret = esp_timer_create(&timer_args, &signal_timer);
if (ret != 0) {
ESP_LOGE(TAG, "Failed to create signal timer");
2025-09-25 18:50:48 +08:00
return;
}
2025-09-26 14:16:44 +08:00
// 启动定时器 (50us = 20kHz)
ret = esp_timer_start_periodic(signal_timer, 50); // 50微秒 = 20kHz
2025-10-09 10:39:54 +08:00
if (ret != 0) {
ESP_LOGE(TAG, "Failed to start signal timer");
2025-09-26 14:16:44 +08:00
esp_timer_delete(signal_timer);
2025-09-25 18:50:48 +08:00
return;
}
2025-10-09 10:39:54 +08:00
ESP_LOGI(TAG, "ECG系统初始化完成定时器启动在20kHz (50us周期)");
2025-09-26 14:16:44 +08:00
}
2025-10-09 10:39:54 +08:00
void init_hardware(void)
{
// 硬件初始化
bsp_i2c_init(); // I2C初始化
LED_init(); // LED初始化
init_ad5328(); // DAC初始化
ESP_LOGI(TAG, "Hardware initialization completed.");
2025-09-25 18:50:48 +08:00
}
// 打印内存使用情况
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;
2025-10-09 10:39:54 +08:00
init_hardware();
init_ecg_system();
2025-09-25 18:50:48 +08:00
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();
}
}
}