stm32f103的 RT-Thread3.1.3移植SFUD+FAL+EasyFlash
Posted 弓长于水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32f103的 RT-Thread3.1.3移植SFUD+FAL+EasyFlash相关的知识,希望对你有一定的参考价值。
学习了有两个星期的RTThread了,有些组件的移植操作还有有必要进行一下记录,1是为自己的学习过程进行记录,2是分享给大家便于大家解决问题,本文记录的就是移植SFUD+FAL+EasyFlash的操作过程,绝对的详细。
本人声明,操作都是本人移植操作,非转载文章,根据本文移植过程出现的问题可以尝试联系博主,感谢支持
环境:Keil5,ENV工具,STM32F103VET6,STM32CubeMX,stm32f103_hal_1.7.0
只要会制作BSP模板,都可以根据本文进行移植,同时博主也发过制作基于RT-Thread3.1.3系统的BSP制作过程,连接如下 STM32F103系列移植rtthread3.1.3完整版详细过程
1.移植SFUD
1.1打开SPI
想要移植SFUD首先得打开SPI的驱动,我们进入BSP模板的**\\board\\CubeMX_Config**路径下通过打开CubeMX_Config.ioc(需要下载STM32CubeMX)进行芯片配置:
在此我打开了SPI1,因为我的开发板没有搭载外部Flash所以根据引脚外部连接,能够外接的SPI就是在我所用的开发板上一直有SPI1,如果大家板子上搭载了外部flash,请根据原理图进行打开。
打开以后软件中不报错就OK了,如果报错,适当调整就可以了。
随后更新代码就可以了,操作如下:
记住一定要选择HAL库1.7.0版本,不然RTT系统会报错。
生成代码以后保留以下4个文件即可
1.2修改Kongfig
打开BSP模板目录下的 board 文件夹,打开 Kongfig 文件进行修改
保证以下数据都是 SPI1 即可,修改以后保存退出。
1.3ENV配置
打开ENV工具进入到BSP文件路径下输入menuconfig进入配置
进入以下选项打开SPI1
接下来打开SUFD组件
进入以下路径,打开如下选项进行配置。完成以后退出保存
pkgs --update升级软件包后,scons --target=mdk5更新MDK5工程
1.4修改代码
打开更新的MDK5工程
首先请先注释掉这一条语句
1、sfud_cfg.h
这里写的是设备的数量以信息,可以挂载多个设备,根据情况而定
2、sfud_flash_def.h
这里记录了支持SFDP的芯片信息,如果自己测试的芯片不属于其中的,自己按照信息添加,这里我不过多赘述:
3、main.c
在主函数中添加初始化过程,在spi1上挂载设备(注:如果是使用的SPI2,就见spi1改成spi2)
#include "drv_spi.h"
#include "spi_flash_sfud.h"
static int rt_hw_spi_flash_init(void)
__HAL_RCC_GPIOB_CLK_ENABLE();
rt_hw_spi_device_attach("spi1", "spi10", GPIOB, GPIO_PIN_5);
if (RT_NULL == rt_sfud_flash_probe("W25Q64DW", "spi10"))
return -RT_ERROR;
;
return RT_EOK;
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
现在SFUD的移植就基本完成了,接下来烧录程序进行测试
1.5测试
可以看到测试过程如下,说明SFUD移植成功
2.移植FAL
2.1修改Kconfig文件
依旧是那个文件,这里我就不再提在哪了
添加如下信息打开片上flash的支持,修改完成以后退出保存
config BSP_USING_ON_CHIP_FLASH
bool "Enable ON_CHIP_FLASH"
default y
2.2ENV配置
依旧是进入路径输入menuconfig
进入以下选项打开片上flash支持
接下来打开fal组件
进行如下配置:
随后退出报错,pkgs --update更新软件包,先别更新MDK工程
在这得移动文件,进入到下载好的软件包路径下,进入到如下路径,fal_cfg.h复制到软件包的inc文件夹,将fal_flash_sfud_port.c移动到src文件夹内
此时就可以更新MDK工程了
2.3修改代码
打开更新好的MDK文件,主要修改的文件有如下:
1、fal_flash_sfud_port.c
设备名称以及参数进行修改
设备名称注意使用移植SFUD时使用的名称
2、fal_cfg.h
设备名称对应,分区按照规格修改即可
3、rtconfig.h
添加宏定义:FAL_USING_SFUD_PORT
此时编译会发现没有报错了,但是,我们需要在主函数里对fal进行初始化
4、mian.c
添加头文件,调用初始化函数就OK了
最后编译烧录,测试程序
2.4测试
经过如下指令测试,结果如图所示即移植成功
3.移植Easyflash
3.1ENV配置
依旧是打开ENV进行配置,输入menuconfig,进入如下选项打开easyflash
对easyflash进行如下配置,主要修改擦以及写的粒度就好了,256k容量以上的stm32f103是2048,以下的是1024,写的粒度就选择F1系列就行了
退出保存以后,pkgs --update升级软件包
再将软件包的ports文件夹内ef_fal_port.c复制粘贴到src文件夹
随后更新MDK工程
3.2修改代码
打开更新好的MDK工程
1、ef_fal_port.c
修改easyflash的名称,保存的变量修改成一个,用于测试
2、fal_cfg.h
由于easyflash是用的fal的接口,所以在片上flash开辟了easyflash的保存区
3、mian.c
因为添加了测试代码,比较多,所以直接写在这里了
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include "drv_spi.h"
#include "spi_flash_sfud.h"
#include "fal.h"
#include <easyflash.h>
void thread_test_entry(void);
int Reboot_time;
static int rt_hw_spi_flash_init(void)
__HAL_RCC_GPIOB_CLK_ENABLE();
rt_hw_spi_device_attach("spi1", "spi10", GPIOB, GPIO_PIN_5);
if (RT_NULL == rt_sfud_flash_probe("W25Q64DW", "spi10"))
return -RT_ERROR;
;
return RT_EOK;
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
int main(void)
int count = 1;
thread_test_entry();
while (count++)
rt_thread_mdelay(500);
return RT_EOK;
void thread_test_entry(void)
fal_init();
if(easyflash_init()==EF_NO_ERR)
ef_get_env_blob("reboot_time",&Reboot_time,4,NULL);
Reboot_time++;
ef_set_env_blob("reboot_time",&Reboot_time,4);
void print_reboot(void)
rt_kprintf("Reboot_Time is %d\\n", Reboot_time);
MSH_CMD_EXPORT(print_reboot, Print reboot);
3.3测试
上电之后会打印初始化信息
第一次输出reboot_time变量
重启之后重新上电,再次输出easyflash保存的变量,发现没有清除,证明easflash移植成功了
以上是关于stm32f103的 RT-Thread3.1.3移植SFUD+FAL+EasyFlash的主要内容,如果未能解决你的问题,请参考以下文章
stm32f103的 RT-Thread3.1.3移植SFUD+FAL+EasyFlash
stm32f103的 RT-Thread3.1.3移植SFUD+FAL+EasyFlash
STM32F103系列移植rtthread3.1.3完整版详细过程