STM32上实现简化版的AUTOSAR DEM模块

发布于:2025-03-14 ⋅ 阅读:(17) ⋅ 点赞:(0)

请添加图片描述

文章目录


摘要

在一些可以不使用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];