CIU32_L051_M307R/bsp/inc/bsp_flash.h

179 lines
6.9 KiB
C
Raw Normal View History

/***
* @Author: mbw
* @Date: 2024-08-22 16:18:15
* @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-08-26 16:58:32
* @FilePath: \USART1_Interrupt - RT-Thread\bsp\inc\bsp_flash.h
* @Description:
* @
* @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
*/
#ifndef __BSP_FLASH__H__
#define __BSP_FLASH__H__
#include "rtthread.h"
#include "bsp_history.h"
#ifdef __cplusplus
extern "C"
{
#endif
/*帧格式4bit + 4bit(月) + 5bit(日) + 5bit(时) + 6bit(分) + (8bit)SUM_CHECK = 32byte*/
#define ErrorStatus std_status_t
#define ERROR STD_ERR
#define SUCCESS STD_OK
#define BASE_YEAR (2024U)
#define FLASH_START_ADDR (0x08000000U)
#define FLASH_PAGE_BYTE_SIZE (512U)
#define FLASH_HR_PAGE_NUM (128U)
#define FALSH_SIZE_KB (64U)
#define FLASH_DEFAULT_VALUE (0xFFFFFFFFU) // 读取word更准确一点
#define HR_RECORD_FRAME_LEN (4U)
#define FLASH_HR_PAGE_RECORD_NUM (FLASH_PAGE_BYTE_SIZE / HR_RECORD_FRAME_LEN)
#define HR_ALARM_PAGES (3U) // 2 + 1 page
#define HR_ALARM_RCY_PAGES (3U) // 2 + 1 page
#define HR_FAULT_PAGES (2U) // 1 + 1 page
#define HR_FAULT_RCY_PAGES (2U) // 1 + 1 page
#define HR_POWER_FAILURE_PAGES (2U) // 1 + 1 page
#define HR_POWER_ON_PAGES (2U) // 1 + 1 page
#define HR_SENSOR_FAILURE_PAGES (1U) // 1 page
#define FLASH_HR_SENSOR_FAILIRE_START_PAGE 126 // 传感器故障信息起始页
#define FLASH_HR_ALARM_PAGE 123 // 报警信息起始页
#define FLASH_HR_ALARM_RCY_PAGE 120 // 报警恢复信息起始页
#define FLASH_HR_FAULT_PAGE 118 // 故障信息起始页
#define FLASH_HR_FAULT_RCY_PAGE 116 // 故障恢复信息起始页
#define FLASH_HR_POWER_FAILURE_PAGE 114 // 掉电信息起始页
#define FLASH_HR_POWER_ON_PAGE 112 // 上电信息起始页
/*最后一页起始地址127page*/
#define FLASH_LAST_PAGE_START_ADDR (FLASH_START_ADDR + (FALSH_SIZE_KB * 1024) - FLASH_PAGE_BYTE_SIZE)
/*传感器失效地址126page*/
#define FLASH_HR_SENSOR_FAILURE_START_ADDR (FLASH_LAST_PAGE_START_ADDR - FLASH_PAGE_BYTE_SIZE)
/*报警起始地址123~125page*/
#define FLASH_HR_ALARM_START_ADDR (FLASH_HR_SENSOR_FAILURE_START_ADDR - FLASH_PAGE_BYTE_SIZE * HR_ALARM_PAGES)
/*报警恢复起始地址120~122page*/
#define FLASH_HR_ALARM_RCY_START_ADDR (FLASH_HR_ALARM_START_ADDR - FLASH_PAGE_BYTE_SIZE * HR_ALARM_RCY_PAGES)
/*故障起始地址118~119page*/
#define FLASH_HR_FAULT_START_ADDR (FLASH_HR_ALARM_RCY_START_ADDR - FLASH_PAGE_BYTE_SIZE * HR_FAULT_PAGES)
/*故障恢复起始地址116~117page*/
#define FLASH_HR_FAULT_RCY_START_ADDR (FLASH_HR_FAULT_START_ADDR - FLASH_PAGE_BYTE_SIZE * HR_FAULT_RCY_PAGES)
/*掉电起始地址114~115page*/
#define FLASH_HR_POWER_FAILURE_START_ADDR (FLASH_HR_FAULT_RCY_START_ADDR - FLASH_PAGE_BYTE_SIZE * HR_POWER_FAILURE_PAGES)
/*上电起始地址112~113page*/
#define FLASH_HR_POWER_ON_START_ADDR (FLASH_HR_POWER_FAILURE_START_ADDR - FLASH_PAGE_BYTE_SIZE * HR_POWER_ON_PAGES)
/*最后一页512个字节用来存储一些初始化信息
*/
#define FLASH_CONFIG_INFO_START_ADDR FLASH_LAST_PAGE_START_ADDR
/*出厂日期:127 page */
#define FLASH_FACTORY_TIME_START_ADDR FLASH_CONFIG_INFO_START_ADDR
/*到期日期:127page + 8byte*/
#define FLASH_EXPIRATION_TIME_START_ADDR (FLASH_FACTORY_TIME_START_ADDR + sizeof(TuFlashProductTimeLimitFrame))
#define FLASH_FIRST_INIT_VALUE (0xA2A3A4A5U) // 第一次写值标志位
#define FLASH_CONFIG_INFO_FRAME_HEADER (0xA5A5U)
#define HR_ALARM_MAX_NUM (256U)
#define HR_ALARM_RCY_MAX_NUM (256U)
#define HR_FAULT_MAX_NUM (128U)
#define HR_FAULT_RCY_MAX_NUM (128U)
#define HR_POWER_FAILURE_MAX_NUM (128U)
#define HR_POWER_ON_MAX_NUM (128U)
#define HR_SENSOR_FAILURE_MAX_NUM (1U)
typedef enum
{
kReadModeByte,
kReadModeHalfWord,
kReadModeword,
} ReadModeType;
/*记录对应项目的总记录数*/
typedef struct
{
uint16_t alarm;
uint16_t alarm_rcy;
uint8_t fault;
uint8_t fault_rcy;
uint8_t power_failure;
uint8_t power_on;
uint8_t sensor_failure;
} TsTotalRecords;
typedef struct
{
uint16_t hr_num; // 记录当前记录数
uint8_t hr_page; // 记录所在页数
uint32_t hr_start_addr; // 记录最新的起始地址
uint32_t hr_index_addr; // 当前要写入的地址
} TsRecordIndex;
#pragma pack(1)
typedef union
{
struct
{
uint8_t year : 4; // 2024+16年
uint8_t month : 4;
uint8_t day : 5;
uint8_t hour : 5;
uint8_t minute : 6;
uint8_t check_sum;
} time;
uint32_t hr_data;
} TuFlashHrRecordFrame;
#pragma pack()
/*
256
0~255
+1~3128
256256
21282128128
1000
31283128128
25620003128
100
*/
typedef enum
{
kRecordAlarm = 0, // at least 200 actually HR_ALARM_MAX_NUM
kRecordAlarmRcy, // at least 200 actually HR_ALARM_RCY_MAX_NUM
kRecordFault, // at least 100 actually HR_FAULT_MAX_NUM
kRecordFaultRcy, // at least 100 actually HR_FAULT_RCY_MAX_NUM
kRecordPowerFailure, // at least 50 actually HR_POWER_FAILURE_MAX_NUM
kRecordPowerOn, // at least 50 actually HR_POWER_ON_MAX_NUM
kRecordSensorFailure // at least 1 actually HR_SENSOR_FAILURE_MAX_NUM
} TeRecord;
void BSP_Flash_Init(void);
ErrorStatus Flash_Write_Record(TeRecord record);
// void Flash_SetProductTimeLimit(uint16_t year, uint8_t mon, uint8_t day, uint8_t hour, uint8_t min, uint8_t second, TeFlashProductTimeLimitId id);
ErrorStatus Flash_GetTotalRecord(TsTotalRecords *pTotalRecords);
ErrorStatus Flash_GetRecord(TeFrameC2 record_type, uint8_t index, TsRecordsTime *pRecordsTime);
#ifdef __cplusplus
}
#endif
#endif // !__BSP_FLASH__H__