Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread Studio
RT-Thread Stduio中使用sfud+fal+easyflash
发布于 2020-03-07 17:08:09 浏览:4673
订阅该版
* 本帖最后由 wlof 于 2020-3-7 17:08 编辑 * 主要还是参考了一个网文: https://blog.csdn.net/m0_37621078/article/details/102689903 一、工程建立 首先基于Stm32L476RETx建一个工程,其中依据自己的硬件,选择对应的串口,设置引脚。 ![001.png](/uploads/202003/07/160813zmlpwzmumwwequ91.png) 生成工程后,设置jlink位置,手上一个淘宝版jlink v8,所以,还是用低版的驱动程序为好。这里使用6.12j以下版本(MDK中一定要手动更换)。 ![002.png](/uploads/202003/07/160914j3mnnuks73s0nuf3.png) 直接编译下载,shell已可以正常工作。 ![003.png](/uploads/202003/07/161008q43k4fks4kv9kvg9.png) 二、添加spi-SFUD 可参考,https://www.rt-thread.org/document/site/rtthread-studio/drivers/spi/rtthread-studio-spi/ 点开spi,sfud,libc也点上。 ![004.png](/uploads/202003/07/161245s3acapao9p9zj3aj.png) 复制文件【这些文件都在下载的源码包里面,手动复制出来,放到工程文件里】 1. t-thread-src\latest\bsp\stm32\libraries\HAL_Drivers下的drv_spi.c和drv_spi.h复制到工程目录drivers下,2. stm32\libraries\HAL_Drivers\drv_flash下的drv_flash.h,drv_flash_l4.c,drv_log.h,复制到工程目录drivers下。3.复制 l4 文件夹 “drv_config.h” drv_flash_l4.c中要开启定义才能使用,在env中是rt_config.h中配置的,但是如果这里也那么配置,在使用界面修改时,会被清除。因此,直接在board.h中定义它就可以。添加片上Flash支持,开SPI支持。![005.png](/uploads/202003/07/162057ledreexe3e9w9rx3.png) 三、添加FAL在软件包中查找FAL,选择最终版本,保存,自动下载软件包并添加到工程,这里打开SFUD的支持。![006.png](/uploads/202003/07/162440kycrgappgj5gx905.png) 复制文件并修改\packages\fal-latest\samples\porting中复制fal_cfg.h和fal_flash_sfud_port.c放到drivers文件夹下。[align=center] 其中fal_cfg.h中定义了分区表,注意修改其中的大小,以适应硬件设备,其设备名字,一定要和系统注册的设备名字一样。在示例代码中,使用的是f2的芯片,直接找到drv_flash_l4.c中的定义文件,设备为stm32_onchip_flash,名字叫onchip_flash,因此在fal_cfg.h中也要做对应的修改。![007.png](/uploads/202003/07/162838p7vuee66fdftzkft.png) 然后,把fal_flash_sfud_port.c里面的内容清空,我们只要在里面注册设备就可以了。 ![008.png](/uploads/202003/07/163112nmbyyss66amnqze9.png) ``` #include "spi_flash_sfud.h" #include "drv_spi.h" #ifndef FAL_USING_NOR_FLASH_DEV_NAME #define FAL_USING_NOR_FLASH_DEV_NAME "norflash0" #endif static int rt_hw_spi_flash_init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); rt_hw_spi_device_attach("spi1", "spi10", GPIOA, GPIO_PIN_4); if (RT_NULL == rt_sfud_flash_probe(FAL_USING_NOR_FLASH_DEV_NAME, "spi10")) { return -RT_ERROR; }; return RT_EOK; } INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init); ``` 然后,在 main函数中添加fal_init(); 四、添加SPI初始化代码 参考官方网文件,使用cubemx生成代码,然后添加到drv_spi.c中就可以了。```/** * @brief SPI MSP Initialization * This function configures the hardware resources used in this example * @param hspi: SPI handle pointer * @retval None */ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hspi->Instance==SPI1) { /* USER CODE BEGIN SPI1_MspInit 0 */ /* USER CODE END SPI1_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_SPI1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**SPI1 GPIO Configuration PA5 ------> SPI1_SCK PA6 ------> SPI1_MISO PA7 ------> SPI1_MOSI */ GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN SPI1_MspInit 1 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); /* USER CODE END SPI1_MspInit 1 */ } } /** * @brief SPI MSP De-Initialization * This function freeze the hardware resources used in this example * @param hspi: SPI handle pointer * @retval None */ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) { if(hspi->Instance==SPI1) { /* USER CODE BEGIN SPI1_MspDeInit 0 */ /* USER CODE END SPI1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_SPI1_CLK_DISABLE(); /**SPI1 GPIO Configuration PA4 ------> SPI1_NSS PA5 ------> SPI1_SCK PA6 ------> SPI1_MISO PA7 ------> SPI1_MOSI */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); /* USER CODE BEGIN SPI1_MspDeInit 1 */ /* USER CODE END SPI1_MspDeInit 1 */ } }```说起来很奇怪,之前我使用的是硬件控制的NSS,怎么弄都不对,后来直接把它去掉就得了,想想也是,那个spi1总线注册之后,不是还要挂好几个设备上去吗?搞出个“spi10” “sp11”之类的,干麻要和那个NSS较劲呢? 编译,下载,启动,挺好。![009.png](/uploads/202003/07/165126hk4lo118t124tb4j.png) 五、添加easyflash 添加easyflash组件,将prot中的ef_fal_port.c文件复制到drivers中,修改FAL_EF_PART_NAME名字为easyflash。修改 ef_env_default_env_set[] ```static const ef_env default_env_set[] = { {"boot_time", "0"}, }; ```![010.png](/uploads/202003/07/165436k7738ggmnik5fd7x.png) 然后,修改main.c,主要是完成fal和easyflash的初始化,参考以下代码 ```#include
#include
#include
#define DBG_TAG "main" #define DBG_LVL DBG_LOG #include
#include "fal.h" #include "easyflash.h" #include
/* PLEASE DEFINE the LED0 pin for your board, such as: PA5 */ //#define LED0_PIN GET_PIN(A, 5) int main(void) { int count = 1; /* set LED0 pin mode to output */ //rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); /* fal init */ fal_init(); /* easyflash init */ if(easyflash_init() == EF_NO_ERR) { rt_uint32_t i_boot_times = 0; char *c_old_boot_times, c_new_boot_times[11] = {0}; c_old_boot_times = ef_get_env("boot_times"); if (c_old_boot_times == RT_NULL) { c_old_boot_times[0] = '0'; } i_boot_times = atol(c_old_boot_times); i_boot_times ++; rt_kprintf("===============================================
"); rt_kprintf("The system now boot %d times
", i_boot_times); rt_kprintf("===============================================
"); sprintf(c_new_boot_times, "%d", i_boot_times); ef_set_env("boot_times", c_new_boot_times); ef_save_env(); } while (count++) { /* set LED0 pin level to high or low */ //rt_pin_write(LED0_PIN, count % 2); //LOG_D("Hello RT-Thread!"); rt_thread_mdelay(1000); } return RT_EOK; }```![011.png](/uploads/202003/07/165753yvcflvxbtk929cli.png) =====================ok! 六、easyflash存了什么呢? 让我们使用fal来看一下 ![012.png](/uploads/202003/07/165949fict5c96afnxfndf.png) OMG,我看到它了,我看到它了,感觉这种写入方式,对存储空间要求还是比较大的啦。不让上传7z文件,使用winrar5压缩的,工程附件 ![stm32l476.rar](/uploads/202003/07/170616nextn7y8onngomoq.rar)
查看更多
8
个回答
默认排序
按发布时间排序
wlof
2020-03-07
这个家伙不懒,什么也没写
如果有各种少头文件的情况发生,就去HAL_Drivers里面找,都在里面,然后复制到自己的drivers中就可以了。
cookie2g
2020-03-25
这家伙很懒,什么也没写!
你好,我用的是407+W25Q128,前面添加FAL,片内Flash这些都没问题,但是用SFUD框架注册SPI驱动,程序下到板子上就报错了。请问这个你有碰到过吗?
cookie2g
2020-03-25
这家伙很懒,什么也没写!
>你好,我用的是407+W25Q128,前面添加FAL,片内Flash这些都没问题,但是用SFUD框架注册SPI驱动,程序下到板 ... --- 问题解决了,需要在drv_spi.c中注册下SPI驱动
wlof
2020-03-30
这个家伙不懒,什么也没写
>问题解决了,需要在drv_spi.c中注册下SPI驱动 --- 不好意思,好久没有上来了,是的,所有设备在使用之前都要进行注册,注册后,在使用时,就可以自动检测设备状态,完成自动初始化、打开等之类的工作了。
kid
2020-05-07
这家伙很懒,什么也没写!
帖子不错, 成功从0复现工程, 灰常感谢, 有几点不太一样 1 fal_flash_sfud_port.c 内容, 我不能全删, 在末尾添加挂载 probe 即可 2 中间下载软件包后,移动到drv中的做法, 我并没有这么来, 关于port 部分的, 需要移动一下文件就行
wlof
2020-05-09
这个家伙不懒,什么也没写
>帖子不错, 成功从0复现工程, 灰常感谢, 有几点不太一样 1 fal_flash_sfud_port.c 内容, 我不能全删, 在末尾 ... --- 不管是什么方法,功能实现了,搞出来了,它就是管用的方法。 提到的复制文件,其实可以直接手动添加到工程里实现。 为什么直接复制文件呢,我们希望当变更工程,如添加新组件等,那些文件都会被添加到工程中来。当我们不主动去写脚本的时候,就可以通过已有的目录进行操作,那些目录下都会有脚本,在生成工程时,会自动添加文件夹下的文件或是指定的文件。
小qya
2020-05-15
这家伙很懒,什么也没写!
你好“复制文件【这些文件都在下载的源码包里面,手动复制出来,放到工程文件里】”在哪里下载
wlof
2020-05-24
这个家伙不懒,什么也没写
>你好“复制文件【这些文件都在下载的源码包里面,手动复制出来,放到工程文件里】”在哪里下载 ... --- \RT-ThreadStudio\download\rt-thread-sdk\rt-thread-src,这里面有你的源码包,如果想自己手动下载可以到[https://www.rt-thread.org/page/download.html](https://www.rt-thread.org/page/download.html)
撰写答案
登录
注册新账号
关注者
0
被浏览
4.7k
关于作者
wlof
这个家伙不懒,什么也没写
提问
24
回答
64
被采纳
0
关注TA
发私信
相关问题
1
rt_thread studio 啥时候能用呢
2
RT_Thread使用反馈帖子
3
RTT studio 下的 AT指令问题。
4
什么时候RTT Sdudio支持Ubuntu,Deepin和UOS操作系统
5
rt thread Studio 关于J-LINK下载问题
6
RT-Thread studio 调试设置问题
7
RTT-Studio 如何设置调试配置参数?
8
rt_thread studio 软件包配置
9
RT-Studio目前只能开发STM32的项目吗?
10
rtt studio 生成hex名字修改
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
19
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部