文章目录
摘要
在一些可以不使用AUTOSAR的项目中,往往也有故障检测和DTC存储的需求,开发一套类似于AUTOSAR DEM模块的软件代码,能够满足DTC的检出和存储,使用FalshDB代替Nvm模块,轻松构建持久化存储,如果你也有这样的需求,请阅读本篇,希望能够帮到你。
/**
******************************************************************************
* @file dem.c
* @brief DEM模块实现 - 基于FlashDB的故障管理
* @note 支持功能:
* - DTC状态管理(当前/历史故障)
* - 故障计数器
* - 快照功能
* - FlashDB持久化存储
******************************************************************************
*/
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "fdb.h"
#include "stm32f4xx_hal.h"
/* 配置区 - 根据实际硬件调整 -------------------------------------------------*/
#define DEM_DB_NAME "dem_db" // 数据库名称
#define DEM_MAX_DTC_ENTRIES 50 // 最大DTC条目数
#define DEM_CURRENT_THRESHOLD 3 // 当前故障确认阈值
#define DEM_HISTORY_MAX_COUNT 0xFF // 历史故障最大计数
/* 宏定义 --------------------------------------------------------------------*/
#define DTC_STATUS_CURRENT (0x01U) // 当前故障状态位
#define DTC_STATUS_HISTORY (0x02U) // 历史故障状态位
#define DEM_SNAPSHOT_MAGIC (0xDEADC0DE) // 快照数据魔数
/* 类型定义 ------------------------------------------------------------------*/
#pragma pack(push, 1) // 严格字节对齐
/**
* @brief DTC条目存储结构
*/
typedef struct {
uint32_t dtc_code; // DTC编码 (SAE标准格式)
uint8_t status; // 状态位
uint16_t current_counter; // 当前故障计数器
uint16_t history_counter; // 历史故障计数器
uint32_t first_occurrence; // 首次发生时间戳
uint32_t last_occurrence; // 最后发生时间戳
} DTC_Entry;
/**
* @brief 快照数据结构
*/
typedef struct {
uint32_t magic; // 魔数校验
uint32_t timestamp; // 快照时间戳
uint16_t dtc_count; // 有效DTC数量
DTC_Entry entries[]; // DTC条目数组
} DEM_Snapshot;
#pragma pack(pop)
/* 模块全局变量 --------------------------------------------------------------*/
static struct fdb_kvdb dem_kvdb; // FlashDB实例
static DTC_Entry dtc_list[DEM_MAX_DTC_ENTRIES];