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

RT-Thread can - STM32F103ZET6

STM32F103系列移植rtthread3.1.3完整版详细过程

STM32F103系列移植rtthread3.1.3完整版详细过程

STM32F103系列移植rtthread3.1.3完整版详细过程