学习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卡中相关推荐

  1. pci-e串口卡linux 驱动下载,万能PCI串口卡驱动下载

    下面点击下载安装,最新更新的这个版本对于很多用户来说,体验感觉还是可以的.虽然有一些小问题没有解决,但是大体上还是符合用户使用需求.尤其是针对之前版本的修改,就比较OK的感觉. 万能PCI串口卡驱动官 ...

  2. JAVA从网络下载文件到本地

    1.首推一种方法,封装好的FileUtils,简单一句话就搞定 /*** 下载文件---返回下载后的文件存储路径* * @param url 文件地址* @param dir 存储目录* @param ...

  3. 【Python】Python的urllib模、urllib2模块的网络下载文件

    因为需要从一些下载一个页PDF文件.但是需要下载PDF有数百个文件,这是不可能用人工点击下载.只是Python有相关模块,所以写一个程序PDF文件下载,顺便熟悉Python的urllib模块和ulrl ...

  4. python模块下载1002python模块下载_【Python】Python的urllib模、urllib2模块的网络下载文件...

    因为需要从一些下载一个页PDF文件.但是需要下载PDF有数百个文件,这是不可能用人工点击下载.只是Python有相关模块,所以写一个程序PDF文件下载,顺便熟悉Python的urllib模块和ulrl ...

  5. iOS之网络下载文件

    文件下载 文件下载在我们日常开发中经常使用到,比如:图片,音频,视频等 简单的小文件下载 get异步下载 - (void)viewDidLoad {[super viewDidLoad];NSStri ...

  6. 异步下载文件 java_在浏览器中异步下载文件监听下载进度

    在浏览器中异步下载文件,其实就是把服务器响应的文件先保存在内存中.然后再一次下载到磁盘.第二次下载过程,就是把内存的数据IO到磁盘,没有网络开销.速度极快. 之所以要先保存在内存,主要是可以在下载开始 ...

  7. python3下载文件-在Python 3中从Web下载文件

    如果要将网页的内容转换为变量,只需read响应urllib.request.urlopen: import urllib.request ... url = 'http://example.com/' ...

  8. header php下载文件很小,php中Accept-Length获取不到下载文件的大小

    php中在做文件下载的时候,其中要加上这么一些header信息:header("Content-type: application/octet-stream"); header(& ...

  9. m5210阵列卡 linux驱动下载,IBM M5210阵列卡驱动下载|IBM阵列卡m5210 2008R2驱动 - 驱动无忧...

    联想IBM m5210服务器阵列卡支持WIN2008R2系统下的驱动程序. 具体支持以下系统: srv_2003_x64 srv_2003_x86 srv_2008_x64 srv_2008_x86 ...

最新文章

  1. 如何理解JavaScript中给变量赋值,是引用还是复制
  2. 第一节 Memcached分布式缓存入门
  3. aop实现原理_SpringAOP原理分析
  4. 操作系统中的死锁问题
  5. 【英语学习】【Level 08】U03 My Choice L1 Good books are like good friends
  6. 4. 吴恩达机器学习课程-作业4-神经网络学习
  7. VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——AlbumView相册控件的使用方式...
  8. centos7的firewall-cmd怎么让指定ip能访问指定端口?
  9. 如何根据经纬度查询地理位置
  10. 双目视觉焦距_双目视觉成像原理
  11. 软件测试薪资高不高?软件测试工资水平调研公布
  12. 阿里云通过镜像迁移系统后,项目报异常Unable to set localhost. This prevents creation of a GUID...
  13. 小游戏贪吃蛇的c++源代码
  14. 2021年Bootstrap实用手册和最强总结以及工具
  15. [渝粤教育] 天津师范大学 基础心理学 参考 资料
  16. 从苏宁电器到卡巴斯基第05篇:我在佳木斯的日子(上)
  17. 程序员中"5%神话";刘未鹏:为什么你应该写博客
  18. VC6.0中单文档程序窗口最大化运行的方法
  19. 数据驱动应用(三):异构数据服务(基于有向无环图DAG)
  20. C++实现MD5摘要算法加盐salt值

热门文章

  1. C语言写三阶矩阵的转置
  2. R语言Tensorflow安装
  3. Excel Sheet页相关操作(21.10现代设计体验)
  4. node版本更新和npm版本更新
  5. FastReport for Delphi2010 中文菜单显示不全或者乱码解决方法
  6. urllib和urllib2的区别和使用
  7. 2018十大最热门编程语言排行榜出炉,Java竟不是第一!
  8. Java程序员编写代码的技巧
  9. 西电操作系统上机实验2
  10. 失业找不到工作,很焦虑怎么办?