#ifndef __BSP_FLASH_H__ #define __BSP_FLASH_H__ //flash 1.0V /********************************************************************* * INCLUDES */ #include "nrf_fstorage.h" #include "nrf_fstorage_sd.h" #include "nrf_pwr_mgmt.h" #include "nrf_soc.h" #include "nrf_log.h" #include "app_error.h" #include "SEGGER_RTT.h" /********************************************************************* * DEFINITIONS */ #define FSTORAGE_READ 0x00 //读标志位 #define FSTORAGE_WRITE 0x01 //写标志位 #define START_FSTORAGE_ADDR 0x00074000UL //FLASH起始地址 #define END_FSTORAGE_ADDR 0x00078000UL //FLASH结束地址 #define FLASH_PAGE_SIZE 4096 //页的长度 #define FLASH_PAGE_NUM ((END_FSTORAGE_ADDR - START_FSTORAGE_ADDR)/FLASH_PAGE_SIZE) //页的个数 #define PAGE_INT_SIZE (FLASH_PAGE_SIZE/4) //一页所包含的4字节个数 #define FLASH_ZONE_ADDR_1 START_FSTORAGE_ADDR //页1首地址 #define FLASH_ZONE_ADDR_2 (FLASH_ZONE_ADDR_1 +FLASH_PAGE_SIZE) //页2首地址 #define FLASH_ZONE_ADDR_3 (FLASH_ZONE_ADDR_2 +FLASH_PAGE_SIZE) //页3首地址 #define FLASH_ZONE_ADDR_4 (FLASH_ZONE_ADDR_3 +FLASH_PAGE_SIZE) //页4首地址 #define FLASH_ZONEADDR_CHECK(zone_addr) ((zone_addr==FLASH_ZONE_ADDR_1 || \ zone_addr==FLASH_ZONE_ADDR_2 || \ zone_addr==FLASH_ZONE_ADDR_3 || \ zone_addr==FLASH_ZONE_ADDR_4)?0:1) //验证是否在页x的范围内 //ERROR CODE #define FLASH_OP_SUCCESS 0x00 //flash操作成功 #define FLASH_ERROR_ZONEADDR (FLASH_OP_SUCCESS+0x01) //区域地址错误 #define FLASH_ERROR_ADDROVERBOUNDS (FLASH_OP_SUCCESS+0x02) //地址越界 #define FLASH_ERROR_ADDRALIGN (FLASH_OP_SUCCESS+0x03) //地址不对齐 #define FLASH_ERROR_DATAALIGN (FLASH_OP_SUCCESS+0x04) //4字节数据不对齐 #define FLASH_ERROR_DATAEXIST (FLASH_OP_SUCCESS+0x05) //数据已存在 #define FLASH_ERROR_PAGENUM (FLASH_OP_SUCCESS+0x06) //页号错误 #define FLASH_ERROR_READ (FLASH_OP_SUCCESS+0x07) //读取错误 #define FLASH_ERROR_WRITE (FLASH_OP_SUCCESS+0x08) //写入错误 #define FLASH_ERROR_ERASE (FLASH_OP_SUCCESS+0x09) //擦除错误 /********************************************************************* * API FUNCTIONS */ //FLASH初始化 void Fstorage_FlashInit(void); //连续读取N个字节 uint32_t Read_N_Byte_flash(uint32_t addr , uint32_t *pData, uint32_t dataLen); //获取输入地址对应的页号 uint32_t GetPageNum(uint32_t addr, uint16_t *PageNum); //根据页号擦除一整页 uint32_t Erase_OnePage(uint16_t PageNum); //连续写入N个4字节(可跨页写,不影响其他数据) uint32_t Write_N_4Byte_flash(uint32_t addr , uint32_t *pdata, uint32_t len); //连续写入N个4字节(调用前FLASH预先已擦除) uint32_t Only_Write_N_4Byte_flash(uint32_t addr , uint32_t *pdata, uint32_t len, bool is_check); //查找一页中可写的空间 uint32_t Find_FreeSpace_In_Page(uint16_t PageNum, uint32_t *start_addr, uint32_t *len); #endif