CIU32_L051_M307R/bsp/inc/bsp_flash.h

195 lines
7.5 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 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_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 (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_FAILURE_PAGE (114U) // 掉电信息起始页
#define FLASH_HR_POWER_ON_PAGE (112U) // 上电信息起始页
/*信息页写值标志值*/
#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_FAILURE_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_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
/*配置信息页初始化标志位地址*/
#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
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;
typedef struct
{
uint16_t hr_num; // 记录当前记录数
uint16_t hr_page; // 记录所在页数
uint32_t hr_start_addr; // 记录最新的起始地址
uint32_t hr_index_addr; // 当前要写入的地址
} TsRecordIndex;
/*记录对应项目的总记录数*/
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;
#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;
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, 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__