rtthread + STM32F407VE + esp8266 +SD卡 从网络下载文件存到SD卡中
学习rtthread,通过文章记录学习过程的一些问题。
手上有一块STM32F407VE的核心板(带sd卡槽,连接MCU的SDIO),和安信可的esp8266-12F模块,现以此为基础实现从网络上下载文件。
一. 使用rtthread studio 创建工程,基于芯片,使用rtthread4.0.2版本,特别注意相同配置在其他版本上不一定能成功。
二. 配置SD卡
2.1 打开项目资源管理器->dirvers->board.h 释放 #define BSP_USING_SDIO 宏
2.2 打开项目资源管理器->dirvers->stm32f4xx_hal_conf.h 释放#define HAL_SD_MODULE_ENABLED
2.3打开RT-Thread setting 打开 SDIO 驱动,fatfs组件,fatfs依赖DFS组件,SDIO及fatfs配置项如下图,特别注意fatfs中的最大处理扇区大小为4096 。
2.4 从rtthread studio 中打开cube MX配置SDIO,选择4bit宽度模式,其他保持默认,点GENERATE CODE后关闭。
2.5 将SD卡设备绑定到根目录,在application目录下创建sd_port.c,编辑sd_port.c ,在文件中添加SD卡mount到根目录的函数,将该函数设置为线程入口,创建线程,并将线程创建的函数添加到自启动。(完成此步后就已经将SD卡挂好了,可以编译下载到核心板试试了)
/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2022-03-19 HKJ the first version*/
#include <rtthread.h>#define BSP_USING_SDCARD#ifdef BSP_USING_SDCARD#include <dfs_elm.h>
#include <dfs_fs.h>
#include <dfs_posix.h>#define DBG_TAG "app.card"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>void sd_mount(void *parameter)
{while (1){rt_thread_mdelay(500);if(rt_device_find("sd0") != RT_NULL){if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK){LOG_I("sd card mount to '/'successed!");break;}else{LOG_W("sd card mount to '/' failed!");}}}
}int stm32_sdcard_mount(void)
{rt_thread_t tid;tid = rt_thread_create("sd_mount", sd_mount, RT_NULL,2048, RT_THREAD_PRIORITY_MAX - 2, 20);if (tid != RT_NULL){rt_thread_startup(tid);}else{LOG_E("create sd_mount thread err!");}return RT_EOK;
}
INIT_APP_EXPORT(stm32_sdcard_mount);#endif /* BSP_USING_SDCARD */
2.6 修改application -> main函数,注释掉输出hello的函数,添加运行指示灯闪烁函数(此步非必要,只是为了方便观察)
2.7 创建的工程默认使用HSI(内部高速时钟),现改为使用外部时钟(此步非必要)。
核心板的外部晶振是8M的。
打开drivers-> board.h修改 BSP_CLOCK_SOURCE 和 BSP_CLOCK_SOURCE_FREQ_MHZ 宏定义,改为HSE 和 ((int32_t)8000000)。
打开dirves->stm32f4xx_hal_conf_bak.h 修改HSE_VALUE宏为 ((int32_t)8000000)。
从rtthread studio中打开cubeMX,设置时钟为外部时钟,并配置时钟频率。
cubmx中配置UART1,115200波特率。
至此SD 卡存储已经处理好,编译程序并下载到板子里测试,测试结果如下图。
三 . 添加at_device 软件包和 webclient软件包,并实现从网络下载文件。
3.1 添加at_device 软件包 ,修改配置项,wifi名,密码,使用的串口选uart3,修改at_device版本为2.02。在这里直接选2.02版本。
3.2 从rtthread studio中打开cubemx 配置串口3,115200波特率,生成代码退出cubemx。
打开drivers-> board.h 添加开启uart3 的宏。
3.3 添加webclient 软件包,修改配置项使能下载文件,选版本号2.1.2,这里也要特别注意版本号(这里要特别注意版本号,我试过2.20的版本会报rt_strcpy 找不到的错,应该是软件包的错,手动修改为strcpy后可以编译通过,也已经实验能成功)。
3.4完成上述步骤后编译提示undefined reference to `_sbrk'错误,这是由于rtthread默认使用了minilibc库(比标准libc少一些东西),这里手动开启libc库组件。
3.5 在application下新建download_file.c ,编写下载文件的代码,代码如下。
#include <rtthread.h>
#include <dfs_posix.h>
#include <webclient.h>#define DOWNLOAD_URL "http://www.rt-thread.com/service/rt-thread.txt"
#define FILE_NAME "/download_test.txt"#define DBG_TAG "download"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>int download_func(void)
{int fd;char buff_read[1024]={0};webclient_get_file(DOWNLOAD_URL,FILE_NAME);fd = open(FILE_NAME, O_RDONLY);if (fd > 0){read(fd, buff_read, 1024);
// rt_kprintf(buff_read);LOG_D("%s",buff_read);return RT_EOK;}else{return RT_ERROR;}}
MSH_CMD_EXPORT(download_func,download file test)
3.6 保存后 编译工程 没有错误,下载到核心板运行,结果如下图成功下载到 文件。*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。 撒花 *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
四. 遇到的问题,
4.1 由于webclient软胶包版本的问题编译报错找不到rt_strcpy 这个函数,换了旧版本用,也可以直接将rt_strcpy改为strcpy,虽然编译通过了,但好像不能正常工作,我也没有仔细找问题所在。
4.2 没有启用libc库导致报 undefined reference to `_sbrk'错误 ,开启libc 组件即可。
4.3 更改AT组件相关配置 编译烧录后一定要断电重启系统和esp8266 否则会报如下的错误。AT Client receive failed, uart device ge data error(-2) 的错。
4.4 已经试过rtthread4.03 版本 at_device 2.02 和2.04 版本,webclient 2.20 和2.12 版本均能实现。
4.5 程序源码已上传。
rtthread + STM32F407VE + esp8266 +SD卡 从网络下载文件存到SD卡中相关推荐
- pci-e串口卡linux 驱动下载,万能PCI串口卡驱动下载
下面点击下载安装,最新更新的这个版本对于很多用户来说,体验感觉还是可以的.虽然有一些小问题没有解决,但是大体上还是符合用户使用需求.尤其是针对之前版本的修改,就比较OK的感觉. 万能PCI串口卡驱动官 ...
- JAVA从网络下载文件到本地
1.首推一种方法,封装好的FileUtils,简单一句话就搞定 /*** 下载文件---返回下载后的文件存储路径* * @param url 文件地址* @param dir 存储目录* @param ...
- 【Python】Python的urllib模、urllib2模块的网络下载文件
因为需要从一些下载一个页PDF文件.但是需要下载PDF有数百个文件,这是不可能用人工点击下载.只是Python有相关模块,所以写一个程序PDF文件下载,顺便熟悉Python的urllib模块和ulrl ...
- python模块下载1002python模块下载_【Python】Python的urllib模、urllib2模块的网络下载文件...
因为需要从一些下载一个页PDF文件.但是需要下载PDF有数百个文件,这是不可能用人工点击下载.只是Python有相关模块,所以写一个程序PDF文件下载,顺便熟悉Python的urllib模块和ulrl ...
- iOS之网络下载文件
文件下载 文件下载在我们日常开发中经常使用到,比如:图片,音频,视频等 简单的小文件下载 get异步下载 - (void)viewDidLoad {[super viewDidLoad];NSStri ...
- 异步下载文件 java_在浏览器中异步下载文件监听下载进度
在浏览器中异步下载文件,其实就是把服务器响应的文件先保存在内存中.然后再一次下载到磁盘.第二次下载过程,就是把内存的数据IO到磁盘,没有网络开销.速度极快. 之所以要先保存在内存,主要是可以在下载开始 ...
- python3下载文件-在Python 3中从Web下载文件
如果要将网页的内容转换为变量,只需read响应urllib.request.urlopen: import urllib.request ... url = 'http://example.com/' ...
- header php下载文件很小,php中Accept-Length获取不到下载文件的大小
php中在做文件下载的时候,其中要加上这么一些header信息:header("Content-type: application/octet-stream"); header(& ...
- m5210阵列卡 linux驱动下载,IBM M5210阵列卡驱动下载|IBM阵列卡m5210 2008R2驱动 - 驱动无忧...
联想IBM m5210服务器阵列卡支持WIN2008R2系统下的驱动程序. 具体支持以下系统: srv_2003_x64 srv_2003_x86 srv_2008_x64 srv_2008_x86 ...
最新文章
- 如何理解JavaScript中给变量赋值,是引用还是复制
- 第一节 Memcached分布式缓存入门
- aop实现原理_SpringAOP原理分析
- 操作系统中的死锁问题
- 【英语学习】【Level 08】U03 My Choice L1 Good books are like good friends
- 4. 吴恩达机器学习课程-作业4-神经网络学习
- VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——AlbumView相册控件的使用方式...
- centos7的firewall-cmd怎么让指定ip能访问指定端口?
- 如何根据经纬度查询地理位置
- 双目视觉焦距_双目视觉成像原理
- 软件测试薪资高不高?软件测试工资水平调研公布
- 阿里云通过镜像迁移系统后,项目报异常Unable to set localhost. This prevents creation of a GUID...
- 小游戏贪吃蛇的c++源代码
- 2021年Bootstrap实用手册和最强总结以及工具
- [渝粤教育] 天津师范大学 基础心理学 参考 资料
- 从苏宁电器到卡巴斯基第05篇:我在佳木斯的日子(上)
- 程序员中"5%神话";刘未鹏:为什么你应该写博客
- VC6.0中单文档程序窗口最大化运行的方法
- 数据驱动应用(三):异构数据服务(基于有向无环图DAG)
- C++实现MD5摘要算法加盐salt值