STM32F103 HAL库 SFUD库移植
最近在学stm32,发现SFUD库只有标准库例程,没有HAL库例程,蛋疼。。。。。。
SFUD 库简介
官方github链接 https://github.com/armink/SFUD
SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SFUD 就是为了解决这些 Flash 的差异现状而设计,让我们的产品能够支持不同品牌及规格的 Flash,提高了涉及到 Flash 功能的软件的可重用性及可扩展性,同时也可以规避 Flash 缺货或停产给产品所带来的风险。
- 主要特点:支持 SPI/QSPI 接口、面向对象(同时支持多个 Flash 对象)、可灵活裁剪、扩展性强、支持 4 字节地址
- 资源占用
- 标准占用:RAM:0.2KB ROM:5.5KB
- 最小占用:RAM:0.1KB ROM:3.6KB
- 设计思路:
- 什么是 SFDP :它是 JEDEC (固态技术协会)制定的串行 Flash 功能的参数表标准,最新版 V1.6B (点击这里查看
- 不支持 SFDP 怎么办 :如果该 Flash 不支持 SFDP 标准,SFUD 会查询配置文件 ( /sfud/inc/sfud_flash_def.h ) 中提供的 Flash 参数信息表 中是否支持该款 Flash。如果不支持,则可以在配置文件中添加该款 Flash 的参数信息(添加方法详细见 2.5 添加库目前不支持的 Flash
这里只放怎么快速在HAL库裸机开发时候移植
1.将库文件拷贝到项目文件夹,并且添加到项目
2.打开sfud_port.c文件
按照上图注释的要求,我们们需要写RCC初始化,spi初始化,gpio(cs引脚)初始化的代码在sfud_port.c文件中。但是我们使用cubemx生成了GPIO和SPI的初始化代码,这里不需要写。
在sfud_spi_port_init()函数中添加需要的代码,我不使用QSPI所以只需要三行:
flash->spi.wr = spi_write_read;
flash->retry.delay = retry_delay_100us;
flash->retry.times = 10000;
注意在main.h中声明一下SPI ,然后hspi就可以在sfud_port.c文件中使用了。
3.重点来了,我们需要手写sfud_err spi_write_read() 函数
/**
- add your spi write and read code
*/
注释说的很明白,要我们写SPI总线先输出数据,然后读取数据(如果有数据要读取)的代码。利用HAL库的函数也很简单。
/**
SPI write data then read data
*/
static sfud_err spi_write_read(const sfud_spi *spi, const uint8_t *write_buf, size_t write_size, uint8_t *read_buf,
size_t read_size) {
sfud_err result = SFUD_SUCCESS;
uint8_t send_data, read_data;
/**
add your spi write and read code
*/
HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1,write_buf,write_size,10);
if(read_size)
HAL_SPI_Receive(&hspi1,read_buf,read_size,10);
HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_SET);
return result;
}
4. 最后需要注意一个函数static void retry_delay_100us(void)
我使用的是f103使用根据SFUD裸机f1标准库例程,大概写了个延时。使用其他单片机可能要算一下,大概100us的软件延时。
static void retry_delay_100us(void) {
uint32_t delay = 120;
while(delay--);
}