CIU32_L051_M307R/bsp/inc/bsp_flash.h

179 lines
6.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/***
* @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
然后每次的最新256条数据为当前页往前256条数据。
举例:
当前最新数据的索引值为2128那么索引值为2128则当前页为第二页第128条数据
那么第一条数据则为1000即为第二一页的第一条
同理当最新的数据为3128那么索引值为3128则当前页为第三页第128条数据
最新的256条数据为2000到3128
假设数据存储只有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__