Stimulate/main/main.c

113 lines
3.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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"
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();
}
}
}