STM_ATEM/User/ltc2508_example.c
zhoujie 2cbd4a152d feat(main): 新增性能监控和调试输出功能
- 新增性能监控模块(performance_monitor),用于实时跟踪系统性能指标
- 添加串口调试输出功能,支持系统状态和性能统计的定期输出
- 实现双缓冲机制,提升ADC数据采集和存储的实时性
- 优化数据存储模块,支持校正后数据的存储和双缓冲管理
- 增强错误处理机制,完善中断回调函数和系统错误恢复

♻️ refactor(ltc2508): 重构ADC驱动支持双缓冲

- 将ADC数据存储从单缓冲区重构为双缓冲区结构
- 新增缓冲区状态管理和自动切换机制
- 优化DMA传输完成回调,支持多缓冲区处理
- 提供缓冲区获取和释放的API接口

📝 docs(performance): 新增性能评估报告和使用指南

- 创建STM32F405性能评估报告,详细分析系统性能指标
- 编写双缓冲机制使用指南,说明实现原理和使用方法
- 添加LTC2508驱动使用示例代码

🐛 fix(dma): 调整DMA中断优先级

- 将DMA2_Stream7中断优先级从9调整为6,优化中断响应
- 更新STM32CubeMX配置文件中的中断优先级设置

🔧 chore(config): 优化系统配置和代码结构

- 添加串口调试输出控制开关和间隔配置
- 清理中断处理文件,移除重复的回调函数定义
- 增强错误处理函数,添加系统状态恢复机制
2026-01-25 20:15:47 +08:00

148 lines
4.1 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.

/**
******************************************************************************
* @file ltc2508_example.c
* @brief LTC2508 双缓冲驱动使用示例
******************************************************************************
*/
#include "ltc2508_driver.h"
#include "main.h"
// 外部SPI句柄声明需要在main.c中定义
extern SPI_HandleTypeDef hspi1;
extern SPI_HandleTypeDef hspi2;
extern SPI_HandleTypeDef hspi3;
/**
* @brief LTC2508 双缓冲使用示例
* @param None
* @retval None
*/
void LTC2508_Example_Usage(void)
{
LTC2508_StatusTypeDef status;
LTC2508_BufferTypeDef *ready_buffer = NULL;
// 1. 初始化LTC2508驱动
status = LTC2508_Init(&hspi1, &hspi2, &hspi3);
if (status != LTC2508_OK) {
// 处理初始化错误
return;
}
// 2. 主循环中的数据采集和处理
while (1) {
// 触发DMA读取非阻塞
status = LTC2508_TriggerDmaRead();
if (status == LTC2508_OK) {
// DMA传输已启动可以继续执行其他任务
}
// 检查是否有准备好的数据
status = LTC2508_GetReadyBuffer(&ready_buffer);
if (status == LTC2508_OK && ready_buffer != NULL) {
// 处理数据
LTC2508_ProcessData(ready_buffer);
// 获取当前读取缓冲区索引并释放
uint8_t current_read_idx = LTC2508_GetCurrentReadBuffer();
LTC2508_ReleaseBuffer(current_read_idx);
}
// 其他任务...
HAL_Delay(1);
}
}
/**
* @brief 处理LTC2508数据的示例函数
* @param buffer: 包含ADC数据的缓冲区
* @retval None
*/
void LTC2508_ProcessData(LTC2508_BufferTypeDef *buffer)
{
if (buffer == NULL) return;
// 验证每个通道的数据
for (uint8_t channel = 0; channel < NUM_LTC2508; channel++) {
if (LTC2508_ValidateData(buffer, channel) == LTC2508_OK) {
// 获取32位ADC数据
uint32_t adc_value = ((uint32_t)buffer->data[channel][0] << 16) |
buffer->data[channel][1];
// 处理数据(例如:转换为电压值、滤波、存储等)
float voltage = LTC2508_ConvertToVoltage(adc_value);
// 可以在这里添加数据处理逻辑
// 例如:数字滤波、数据存储、通信发送等
}
}
// 记录时间戳
uint32_t timestamp = buffer->timestamp;
// 可以用于计算采样率或数据同步
}
/**
* @brief 将ADC原始数据转换为电压值
* @param adc_value: 32位ADC原始数据
* @retval float: 对应的电压值
*/
float LTC2508_ConvertToVoltage(uint32_t adc_value)
{
// LTC2508是32位ADC假设参考电压为5V
const float VREF = 5.0f;
const uint32_t ADC_MAX = 0xFFFFFFFF;
return (float)adc_value * VREF / ADC_MAX;
}
/**
* @brief SPI DMA传输完成中断回调函数
* @param hspi: SPI句柄
* @retval None
*/
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
// 调用LTC2508的DMA完成回调
LTC2508_DmaComplete_Callback(hspi);
}
/**
* @brief SPI DMA接收完成中断回调函数
* @param hspi: SPI句柄
* @retval None
*/
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
// 调用LTC2508的DMA完成回调
LTC2508_DmaComplete_Callback(hspi);
}
/**
* @brief SPI错误中断回调函数
* @param hspi: SPI句柄
* @retval None
*/
void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
{
// 调用LTC2508的错误回调
LTC2508_ErrorCallback(hspi);
}
/**
* @brief 获取并打印LTC2508统计信息
* @param None
* @retval None
*/
void LTC2508_PrintStats(void)
{
LTC2508_StatsTypeDef stats;
LTC2508_GetStats(&stats);
// 可以通过UART或其他方式输出统计信息
// printf("Total samples: %lu\n", stats.total_samples);
// printf("Error count: %lu\n", stats.error_count);
// printf("DMA errors: %lu\n", stats.dma_error_count);
// printf("Buffer overflows: %lu\n", stats.buffer_overflow_count);
}