对于不同底层驱动的flash操作实现,统一封装成本文所述hal flash接口。 hal相关头文件位于目录:include/aos/hal。hal相关实现位于具体的mcu目录下,如:platform/mcu/stm32f1xx/hal/。
API列表
hal_flash_info_get | 获取指定区域的FLASH信息 |
hal_flash_erase | 擦除FLASH的指定区域 |
hal_flash_write | 写FLASH的指定区域 |
hal_flash_erase_write | 先擦除再写FLASH的指定区域 |
hal_flash_read | 读FLASH的指定区域 |
hal_flash_enable_secure | 使能加密FLASH的指定区域 |
hal_flash_dis_secure | 关闭加密FLASH的指定区域 |
hal_flash_addr2offset | 将物理地址转换为分区号和偏移 |
API详情
相关宏定义
#define PAR_OPT_READ_POS ( 0 )
#define PAR_OPT_WRITE_POS ( 1 )
#define PAR_OPT_READ_MASK ( 0x1u << PAR_OPT_READ_POS )
#define PAR_OPT_WRITE_MASK ( 0x1u << PAR_OPT_WRITE_POS )
#define PAR_OPT_READ_DIS ( 0x0u << PAR_OPT_READ_POS )
#define PAR_OPT_READ_EN ( 0x1u << PAR_OPT_READ_POS )
#define PAR_OPT_WRITE_DIS ( 0x0u << PAR_OPT_WRITE_POS )
#define PAR_OPT_WRITE_EN ( 0x1u << PAR_OPT_WRITE_POS )
相关数据结构
hal_logic_partition_t
typedef struct {
hal_flash_t partition_owner;
const char *partition_description;
uint32_t partition_start_addr;
uint32_t partition_length;
uint32_t partition_options;
} hal_logic_partition_t;
hal_flash_t
typedef enum {
HAL_FLASH_EMBEDDED,
HAL_FLASH_SPI,
HAL_FLASH_QSPI,
HAL_FLASH_MAX,
HAL_FLASH_NONE,
} hal_flash_t;
hal_partition_t
typedef enum {
HAL_PARTITION_ERROR = -1,
HAL_PARTITION_BOOTLOADER,
HAL_PARTITION_APPLICATION,
HAL_PARTITION_ATE,
HAL_PARTITION_OTA_TEMP,
HAL_PARTITION_RF_FIRMWARE,
HAL_PARTITION_PARAMETER_1,
HAL_PARTITION_PARAMETER_2,
HAL_PARTITION_PARAMETER_3,
HAL_PARTITION_PARAMETER_4,
HAL_PARTITION_BT_FIRMWARE,
HAL_PARTITION_SPIFFS,
HAL_PARTITION_CUSTOM_1,
HAL_PARTITION_CUSTOM_2,
HAL_PARTITION_RECOVERY,
HAL_PARTITION_RECOVERY_BACK_PARA,
HAL_PARTITION_MAX,
HAL_PARTITION_NONE,
} hal_partition_t;
hal_flash_info_get
获取指定区域的FLASH信息
函数原型
int32_t hal_flash_info_get(hal_partition_t in_partition, hal_logic_partition_t *partition)
参数
hal_partition_t in_partition | 入参 | FLASH分区号 | HAL_PARTITION_APPLICATION |
hal_logic_partition_t *partition | 出参 | 分区信息 | 用户自定义一个hal_logic_partition_t结构体 |
返回值
成功则返回0,非0表示失败
调用示例
hal_logic_partition_t partition_info = {0};
ret = hal_flash_info_get(HAL_PARTITION_APPLICATION,&partition_info);
hal_flash_erase
擦除FLASH的指定区域
函数原型
int32_t hal_flash_erase(hal_partition_t pno, uint32_t off_set, uint32_t size)
参数
hal_partition_t pno | 入参 | FLASH分区号 | HAL_PARTITION_APPLICATION |
uint32_t off_set | 入参 | 偏移量 | 0 |
uint32_t size | 入参 | 要擦除的字节数 | 512 |
返回值
返回成功或失败, 返回0表示擦除成功,非0表示失败
调用示例
ret = hal_flash_erase(HAL_PARTITION_APPLICATION,0,512);
hal_flash_write
写FLASH的指定区域
函数原型
int32_t hal_flash_write(hal_partition_t pno, uint32_t *poff, const void *buf , uint32_t buf_size)
参数
hal_partition_t pno | 入参 | FLASH分区号 | HAL_PARTITION_APPLICATION |
uint32_t *poff | 入参+出参 | 偏移量,写入后其值会刷新为写尾部 | |
const void *buf | 入参 | 指向要写入数据的指针 | char buf[512] |
uint32_t buf_size | 入参 | 要写入的字节数 | 512 |
返回值
返回成功或失败, 返回0表示写入成功,非0表示失败
调用示例
uint32_t off = 0;
char buf[512] = {0};
ret = hal_flash_write(HAL_PARTITION_APPLICATION,&off,buf,512);
hal_flash_erase_write
先擦除再写FLASH的指定区域
函数原型
int32_t hal_flash_erase_write(hal_partition_t in_partition, uint32_t *off_set, const void *in_buf, uint32_t in_buf_len);
参数
hal_partition_t in_partition | 入参 | FLASH分区号 | HAL_PARTITION_APPLICATION |
uint32_t *off_set | 入参+出参 | 偏移量,写入后其值会更新为写尾部 | 偏移量 |
const void *in_buf | 入参 | 指向要写入数据的指针 | char buf[512] |
uint32_t in_buf_len | 入参 | 要擦除和写入的字节数 | 512 |
返回值
返回成功或失败, 返回0表示擦除写入成功,非0表示失败
调用示例
uint32_t off = 0;
char buf[512] = {0};
ret = hal_flash_erase_write(HAL_PARTITION_APPLICATION,&off,buf,512);
hal_flash_read
读取FLASH的指定区域
函数原型
int32_t hal_flash_read(hal_partition_t in_partition, uint32_t *off_set, void *out_buf, uint32_t in_buf_len);
参数
hal_partition_t in_partition | 入参 | FLASH分区号 | HAL_PARTITION_APPLICATION |
uint32_t *off_set | 入参+出参 | 偏移量,读取后其值会更新为读取的尾部偏移位置 | |
void *out_buf | 入参 | 数据缓冲区地址 | char buf[512] |
uint32_t in_buf_len | 入参 | 要读取的字节数 | 512 |
返回值
返回成功或失败, 返回0表示读取成功,非0表示失败
调用示例
uint32_t off = 0;
char buf[512] = {0};
ret = hal_flash_read(HAL_PARTITION_APPLICATION,&off,buf,512);
hal_flash_enable_secure
使能加密FLASH的指定区域
函数原型
int32_t hal_flash_enable_secure(hal_partition_t partition, uint32_t off_set, uint32_t size);
参数
hal_partition_t in_partition | 入参 | FLASH分区号 | HAL_PARTITION_APPLICATION |
uint32_t off_set | 入参 | 偏移量 | 0 |
uint32_t size | 入参 | 使能区域字节数 | 512 |
返回值
返回成功或失败, 返回0表示使能成功,非0表示失败
调用示例
ret = hal_flash_enable_secure(HAL_PARTITION_APPLICATION,0,512);
hal_flash_dis_secure
关闭加密FLASH的指定区域
函数原型
int32_t hal_flash_dis_secure(hal_partition_t partition, uint32_t off_set, uint32_t size);
参数
hal_partition_t in_partition | 入参 | FLASH分区号 | HAL_PARTITION_APPLICATION |
uint32_t off_set | 入参 | 偏移量 | 0 |
uint32_t size | 入参 | 去使能加密区域字节数 | 512 |
返回值
返回成功或失败, 返回0表示关闭成功,非0表示失败
调用示例
ret = hal_flash_dis_secure(HAL_PARTITION_APPLICATION,0,512);
hal_flash_addr2offset
将物理地址转换为分区号和偏移。该偏移与hal_partitions分区表配置相关。
函数原型
int32_t hal_flash_addr2offset(hal_partition_t *in_partition, uint32_t *off_set, uint32_t addr);
参数
hal_partition_t *in_partition | 出参 | 获取到的FLASH分区号 | |
uint32_t *off_set | 出参 | 获取到的该地址在分区内偏移 | |
uint32_t addr | 入参 | 输入需要查询地址 | 0x400000 |
返回值
返回成功或失败, 返回0表示转换成功,非0表示失败
调用示例
hal_partition_t in_partition;
uint32_t off_set=0;
ret = hal_flash_addr2offset(&in_partition,&off_set,0x400000);
使用
添加该组件
在相应的platform/mcu的mk内,添加对应hal文件的编译包含。
包含头文件
#include "aos/hal/flash.h"
在文档使用中是否遇到以下问题
更多建议
匿名提交