- 新增性能监控模块(performance_monitor),用于实时跟踪系统性能指标 - 添加串口调试输出功能,支持系统状态和性能统计的定期输出 - 实现双缓冲机制,提升ADC数据采集和存储的实时性 - 优化数据存储模块,支持校正后数据的存储和双缓冲管理 - 增强错误处理机制,完善中断回调函数和系统错误恢复 ♻️ refactor(ltc2508): 重构ADC驱动支持双缓冲 - 将ADC数据存储从单缓冲区重构为双缓冲区结构 - 新增缓冲区状态管理和自动切换机制 - 优化DMA传输完成回调,支持多缓冲区处理 - 提供缓冲区获取和释放的API接口 📝 docs(performance): 新增性能评估报告和使用指南 - 创建STM32F405性能评估报告,详细分析系统性能指标 - 编写双缓冲机制使用指南,说明实现原理和使用方法 - 添加LTC2508驱动使用示例代码 🐛 fix(dma): 调整DMA中断优先级 - 将DMA2_Stream7中断优先级从9调整为6,优化中断响应 - 更新STM32CubeMX配置文件中的中断优先级设置 🔧 chore(config): 优化系统配置和代码结构 - 添加串口调试输出控制开关和间隔配置 - 清理中断处理文件,移除重复的回调函数定义 - 增强错误处理函数,添加系统状态恢复机制
148 lines
4.1 KiB
C
148 lines
4.1 KiB
C
/**
|
||
******************************************************************************
|
||
* @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);
|
||
} |