/*** * @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 HR_RECORD_FRAME_LEN (4U) #define FALSH_SIZE_KB (64U) #define FLASH_PAGE_RECORD_WORD_NUM (128U) #define FLASH_PAGE_BYTE_SIZE (512U) #define BASE_YEAR (2024U) #define FLASH_START_ADDR (0x08000000U) #define FLASH_DEFAULT_VALUE (0xFFFFFFFFU) // 读取word更准确一点 #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_down_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 (126U) // 传感器故障信息起始页 #define FLASH_HR_ALARM_PAGE (123U) // 报警信息起始页 #define FLASH_HR_ALARM_RCY_PAGE (120U) // 报警恢复信息起始页 #define FLASH_HR_FAULT_PAGE (118U) // 故障信息起始页 #define FLASH_HR_FAULT_RCY_PAGE (116U) // 故障恢复信息起始页 #define FLASH_HR_power_down_PAGE (114U) // 掉电信息起始页 #define FLASH_HR_POWER_ON_PAGE (112U) // 上电信息起始页 #define FLASH_HR_INFO_PAGE (127U) /*信息页写值标志值*/ #define FLASH_FIRST_INIT_VALUE (0xA2A3A4A5U) // 第一次写值标志位 /*每页512个字节,每条记录4byte*/ #define FLASH_HR_PAGE_RECORD_NUM (FLASH_PAGE_BYTE_SIZE / HR_RECORD_FRAME_LEN) #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_down_MAX_NUM (128U) #define HR_POWER_ON_MAX_NUM (128U) #define HR_SENSOR_FAILURE_MAX_NUM (1U) #define CHECKSUM_MASK 0xFF /*最后一页起始地址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_down_START_ADDR (FLASH_HR_FAULT_RCY_START_ADDR - FLASH_PAGE_BYTE_SIZE * HR_power_down_PAGES) /*上电起始地址:112~113page*/ #define FLASH_HR_POWER_ON_START_ADDR (FLASH_HR_power_down_START_ADDR - FLASH_PAGE_BYTE_SIZE * HR_POWER_ON_PAGES) /*最后一页512个字节,用来存储一些初始化信息: 信息页初始化标志 出厂日期 到期日期 报警值 软件版本 硬件版本 公司名称 更新日期 */ #define FLASH_CONFIG_INFO_START_ADDR FLASH_LAST_PAGE_START_ADDR /*配置信息页初始化标志位地址*/ #define FLASH_CONFIG_INFO_INIT_FLAG_ADDR FLASH_CONFIG_INFO_START_ADDR /*出厂日期:127 page */ #define FLASH_FACTORY_TIME_ADDR (FLASH_CONFIG_INFO_INIT_FLAG_ADDR + sizeof(uint32_t)) /*到期日期:127page + 8byte*/ #define FLASH_EXPIRATION_TIME_ADDR (FLASH_FACTORY_TIME_ADDR + sizeof(uint32_t)) /*低阈值报警值地址 */ #define FLASH_LOW_ALARM_VALUE_ADDR (FLASH_EXPIRATION_TIME_ADDR + sizeof(uint32_t)) /*高阈值报警值地址 */ #define FLASH_HIGH_ALARM_VALUE_ADDR (FLASH_LOW_ALARM_VALUE_ADDR + sizeof(uint32_t)) /*软件版本地址 */ #define FLASH_SOFTWARE_VERSION_ADDR (FLASH_HIGH_ALARM_VALUE_ADDR + sizeof(uint32_t)) /*硬件版本地址 */ #define FLASH_HARDWARE_VERSION_ADDR (FLASH_SOFTWARE_VERSION_ADDR + sizeof(uint32_t)) /*公司名称地址 */ #define FLASH_COMPANY_NAME_ADDR (FLASH_HARDWARE_VERSION_ADDR + sizeof(uint32_t)) /*更新日期地址 */ #define FLASH_UPDATE_TIME_ADDR (FLASH_COMPANY_NAME_ADDR + sizeof(uint32_t)) typedef enum { kFlashInitFlag, // 0xA2A3A4A5 kFlashFactoryTime, kFlashExpirationTime, kFlashLowAlarmValue, kFlashHighAlarmValue, kFlashSoftwareVersion, kFlashHardwareVersion, kFlashCompanyName, kFlashUpdateTime, kFlashReadModeMax } TeFlashReadInfo; 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 kRecordPowerDown, // at least 50 actually HR_power_down_MAX_NUM kRecordPowerOn, // at least 50 actually HR_POWER_ON_MAX_NUM kRecordSensorFailure // at least 1 actually HR_SENSOR_FAILURE_MAX_NUM } TeRecord; typedef struct { uint16_t hr_num; // 记录当前记录数 uint16_t hr_page; // 记录所在页数 uint32_t hr_start_addr; // 记录最新的起始地址 uint32_t hr_index_addr; // 当前要写入的地址 } TsRecordIndex; /*记录对应项目的总记录数*/ typedef struct { uint8_t alarm; uint8_t alarm_rcy; uint8_t fault; uint8_t fault_rcy; uint8_t power_down; uint8_t power_on; uint8_t sensor_failure; } TsTotalRecords; #pragma pack(push, 1) typedef union { struct __attribute__((packed)) { uint32_t year : 4; // 16年 uint32_t month : 4; uint32_t day : 5; uint32_t hour : 5; uint32_t minute : 6; uint32_t check_sum : 8; } time ; uint32_t hr_data; } TuFlashHrRecordFrame; #pragma pack(pop) typedef enum { kFactoryTimeId, kExpirationTimeId, } TeFlashProductTimeLimitId; int 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, TeFlashProductTimeLimitId id); ErrorStatus Flash_GetTotalRecord(TsTotalRecords *pTotalRecords); ErrorStatus Flash_GetRecord(TeFrameC2 record_type, uint8_t index, TsRecordsTime *pRecordsTime); ErrorStatus Flash_GetProductTimeLimit(TuFlashHrRecordFrame *pLimitTime, TeFlashProductTimeLimitId id); // #ifdef __cplusplus // } // #endif #endif // !__BSP_FLASH__H__