STM32F103 HAL库 SFUD库移植

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--);
}

5. 可以优雅的使用库函数读写flsh了,注意如果单片机程序卡死在每次不同的位置,可能是堆栈炸了,在cubemx上设置大一点。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值