fc10ef2e10
GD32F470ZGT6 based project with full peripheral support: - SDRAM (W9825G6KH) via EXMC - LCD NT35510 (480x800) via EXMC NOR/PSRAM - Flash (W25Q64) via SPI - UART (USART0) debug console - LED indicators - CMSIS-DAP debug interface - CMake + ARM GCC toolchain build system
181 lines
4.6 KiB
C++
181 lines
4.6 KiB
C++
#ifndef __FLASH_DRIVER_H__
|
||
#define __FLASH_DRIVER_H__
|
||
|
||
#include <cstdint>
|
||
#include "common_types.h"
|
||
|
||
/* Flash类型定义 */
|
||
typedef enum {
|
||
FLASH_TYPE_INTERNAL = 0, /* 内部Flash(片上Flash) */
|
||
FLASH_TYPE_EXTERNAL_SPI, /* 外部SPI Flash */
|
||
FLASH_TYPE_EXTERNAL_NOR, /* 外部并行NOR Flash(通过EXMC) */
|
||
FLASH_TYPE_MAX
|
||
} flash_type_t;
|
||
|
||
/* Flash操作模式定义 */
|
||
typedef enum {
|
||
FLASH_OP_READ = 0, /* 读取操作 */
|
||
FLASH_OP_WRITE, /* 写入操作 */
|
||
FLASH_OP_ERASE, /* 擦除操作 */
|
||
FLASH_OP_READ_STATUS, /* 读取状态寄存器 */
|
||
FLASH_OP_WRITE_ENABLE, /* 写使能 */
|
||
FLASH_OP_WRITE_DISABLE, /* 写禁用 */
|
||
FLASH_OP_MAX
|
||
} flash_operation_t;
|
||
|
||
/* Flash容量信息结构体 */
|
||
typedef struct {
|
||
uint32_t total_size; /* 总容量(字节) */
|
||
uint32_t sector_size; /* 扇区大小(字节) */
|
||
uint32_t page_size; /* 页大小(字节) */
|
||
uint32_t block_size; /* 块大小(字节) */
|
||
uint32_t manufacturer_id; /* 制造商ID */
|
||
uint32_t device_id; /* 设备ID */
|
||
} flash_info_t;
|
||
|
||
/* Flash配置结构体 */
|
||
typedef struct {
|
||
flash_type_t type; /* Flash类型 */
|
||
uint32_t base_address; /* 基地址(对于内部Flash是0x08000000) */
|
||
uint32_t clock_freq; /* 时钟频率(Hz,仅对外部Flash有效) */
|
||
uint32_t cs_pin; /* 片选引脚(仅对外部SPI Flash有效) */
|
||
uint32_t spi_port; /* SPI端口(仅对外部SPI Flash有效) */
|
||
uint32_t exmc_bank; /* EXMC Bank(仅对外部NOR Flash有效) */
|
||
} flash_config_t;
|
||
|
||
/* Flash句柄结构体 */
|
||
typedef struct {
|
||
flash_type_t type; /* Flash类型 */
|
||
flash_config_t config; /* Flash配置 */
|
||
flash_info_t info; /* Flash信息 */
|
||
bool initialized; /* 初始化标志 */
|
||
void *private_data; /* 私有数据指针 */
|
||
} flash_handle_t;
|
||
|
||
/* 函数声明 */
|
||
|
||
/**
|
||
* @brief 初始化Flash
|
||
* @param handle Flash句柄指针
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_init(flash_handle_t *handle);
|
||
|
||
/**
|
||
* @brief 反初始化Flash
|
||
* @param handle Flash句柄指针
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_deinit(flash_handle_t *handle);
|
||
|
||
/**
|
||
* @brief 读取Flash数据
|
||
* @param handle Flash句柄指针
|
||
* @param address 地址(绝对地址或相对地址,取决于Flash类型)
|
||
* @param buffer 数据缓冲区
|
||
* @param length 数据长度(字节)
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_read(flash_handle_t *handle, uint32_t address, void *buffer, uint32_t length);
|
||
|
||
/**
|
||
* @brief 写入Flash数据
|
||
* @param handle Flash句柄指针
|
||
* @param address 地址(绝对地址或相对地址,取决于Flash类型)
|
||
* @param data 数据指针
|
||
* @param length 数据长度(字节)
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_write(flash_handle_t *handle, uint32_t address, const void *data, uint32_t length);
|
||
|
||
/**
|
||
* @brief 擦除Flash扇区
|
||
* @param handle Flash句柄指针
|
||
* @param address 扇区起始地址
|
||
* @param size 擦除大小(字节),必须为扇区大小的整数倍
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_erase(flash_handle_t *handle, uint32_t address, uint32_t size);
|
||
|
||
/**
|
||
* @brief 擦除整个Flash
|
||
* @param handle Flash句柄指针
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_erase_all(flash_handle_t *handle);
|
||
|
||
/**
|
||
* @brief 读取Flash状态寄存器
|
||
* @param handle Flash句柄指针
|
||
* @param status 状态值输出指针
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_read_status(flash_handle_t *handle, uint32_t *status);
|
||
|
||
/**
|
||
* @brief 写使能
|
||
* @param handle Flash句柄指针
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_write_enable(flash_handle_t *handle);
|
||
|
||
/**
|
||
* @brief 写禁用
|
||
* @param handle Flash句柄指针
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_write_disable(flash_handle_t *handle);
|
||
|
||
/**
|
||
* @brief 读取Flash信息
|
||
* @param handle Flash句柄指针
|
||
* @param info Flash信息输出指针
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_get_info(flash_handle_t *handle, flash_info_t *info);
|
||
|
||
/**
|
||
* @brief 验证Flash读写功能
|
||
* @param handle Flash句柄指针
|
||
* @param test_size 测试数据大小(字节)
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_self_test(flash_handle_t *handle, uint32_t test_size);
|
||
|
||
/**
|
||
* @brief 默认内部Flash初始化
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_internal_default_init(void);
|
||
|
||
/**
|
||
* @brief 默认外部SPI Flash初始化
|
||
* @return 操作结果
|
||
*/
|
||
ret_code_t flash_external_spi_default_init(void);
|
||
|
||
/**
|
||
* @brief 获取内部Flash基地址
|
||
* @return 内部Flash基地址(0x08000000)
|
||
*/
|
||
uint32_t flash_get_internal_base_address(void);
|
||
|
||
/**
|
||
* @brief 获取内部Flash总大小
|
||
* @return 内部Flash总大小(字节)
|
||
*/
|
||
uint32_t flash_get_internal_total_size(void);
|
||
|
||
/**
|
||
* @brief 获取内部Flash扇区大小
|
||
* @return 内部Flash扇区大小(字节)
|
||
*/
|
||
uint32_t flash_get_internal_sector_size(void);
|
||
|
||
/**
|
||
* @brief 获取默认外部SPI Flash句柄指针
|
||
* @return Flash句柄指针,如果未初始化则返回NULL
|
||
*/
|
||
flash_handle_t *flash_get_external_spi_handle(void);
|
||
|
||
#endif /* __FLASH_DRIVER_H__ */ |