feat(adc): implement comprehensive ADC data acquisition and processing system

Add complete data acquisition pipeline with LTC2508 ADC drivers, correction algorithms,
data storage, and system monitoring. Includes ARM DSP optimized matrix operations for
sensor calibration, SD card data logging with USB mass storage, and robust error handling
with validation throughout the processing chain.

- Add LTC2508 multi-channel SPI driver with DMA support and error recovery
- Implement correction module with ARM DSP matrix operations for sensor calibration
- Add data storage system with SD card logging and configurable file management
- Integrate system monitor for health tracking and error reporting
- Enhance data packet structure with CRC validation and timestamps
- Add USB mass storage interface for SD card access
- Implement comprehensive error handling and statistics collection
This commit is contained in:
2026-01-25 18:15:13 +08:00
parent 8d9bcd092b
commit 6297f3044d
12 changed files with 975 additions and 192 deletions
+62 -16
View File
@@ -22,7 +22,8 @@
#include "usbd_storage_if.h"
/* USER CODE BEGIN INCLUDE */
#include "fatfs.h"
#include "ff.h"
/* USER CODE END INCLUDE */
/* Private typedef -----------------------------------------------------------*/
@@ -31,7 +32,11 @@
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
extern SD_HandleTypeDef hsd;
extern FATFS SDFatFS;
extern char SDPath[4];
static uint8_t sd_initialized = 0;
/* USER CODE END PV */
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
@@ -177,8 +182,19 @@ USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
int8_t STORAGE_Init_FS(uint8_t lun)
{
/* USER CODE BEGIN 2 */
UNUSED(lun);
UNUSED(lun);
// 初始化SD卡
if (HAL_SD_Init(&hsd) != HAL_OK) {
return (USBD_FAIL);
}
// 挂载文件系统
if (f_mount(&SDFatFS, SDPath, 1) != FR_OK) {
return (USBD_FAIL);
}
sd_initialized = 1;
return (USBD_OK);
/* USER CODE END 2 */
}
@@ -194,9 +210,20 @@ int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_
{
/* USER CODE BEGIN 3 */
UNUSED(lun);
*block_num = STORAGE_BLK_NBR;
*block_size = STORAGE_BLK_SIZ;
if (!sd_initialized) {
return (USBD_FAIL);
}
HAL_SD_CardInfoTypeDef cardinfo;
if (HAL_SD_GetCardInfo(&hsd, &cardinfo) == HAL_OK) {
*block_num = cardinfo.LogBlockNbr;
*block_size = cardinfo.LogBlockSize;
} else {
*block_num = STORAGE_BLK_NBR;
*block_size = STORAGE_BLK_SIZ;
}
return (USBD_OK);
/* USER CODE END 3 */
}
@@ -210,8 +237,17 @@ int8_t STORAGE_IsReady_FS(uint8_t lun)
{
/* USER CODE BEGIN 4 */
UNUSED(lun);
return (USBD_OK);
if (!sd_initialized) {
return (USBD_FAIL);
}
HAL_SD_CardStateTypeDef state = HAL_SD_GetCardState(&hsd);
if (state == HAL_SD_CARD_TRANSFER) {
return (USBD_OK);
}
return (USBD_FAIL);
/* USER CODE END 4 */
}
@@ -241,10 +277,15 @@ int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t bl
{
/* USER CODE BEGIN 6 */
UNUSED(lun);
UNUSED(buf);
UNUSED(blk_addr);
UNUSED(blk_len);
if (!sd_initialized || buf == NULL) {
return (USBD_FAIL);
}
if (HAL_SD_ReadBlocks(&hsd, buf, blk_addr, blk_len, HAL_MAX_DELAY) != HAL_OK) {
return (USBD_FAIL);
}
return (USBD_OK);
/* USER CODE END 6 */
}
@@ -261,10 +302,15 @@ int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t b
{
/* USER CODE BEGIN 7 */
UNUSED(lun);
UNUSED(buf);
UNUSED(blk_addr);
UNUSED(blk_len);
if (!sd_initialized || buf == NULL) {
return (USBD_FAIL);
}
if (HAL_SD_WriteBlocks(&hsd, buf, blk_addr, blk_len, HAL_MAX_DELAY) != HAL_OK) {
return (USBD_FAIL);
}
return (USBD_OK);
/* USER CODE END 7 */
}