Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Network
STM32 Nucleo-64 开发板连接 RW007 WiFi 模块
发布于 2019-03-01 17:32:31 浏览:5481
订阅该版
[tocm] * 本帖最后由 国际哥 于 2019-3-1 21:46 编辑 * RW007 刚发布不久,我便拿到了模块实物,并用开发板玩了起来,然而在使用过程中频频碰壁、踩了不少坑,觉得有必要记录下来,为后人栽树。 ### 一、简介 本文使用 STM32 Nucleo 开发板连接 RW007 WiFi 模块,通过运行 RT-Thread 操作系统,让开发板轻松愉快联网。 #### STM32F401 Nucleo-64 STM32 Nucleo-64 是 ST 官方推出的开发板,依据搭载的 STM32 芯片型号不同(皆为 LQFP64 封装),分为众多版本,本文所使用的是带 STM32F401RE 芯片的板子 —— `STM32F401 Nucleo-64`。 ![图1 STM32F401 Nucleo-64](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/en.nucleo-F4.jpg "STM32F401 Nucleo-64") ##### 主要特性 * STM32F401RET6 64 脚 MCU * ARM Cortex-M4 内核,84MHz 主频 * 512KB Flash, 96KB SRAM 存储容量 * Arduino Uno 和 ST morpho 两类扩展接口 * 板载 ST-LINK/V2-1 调试编程器、USB 调试串口 Nucleo 上的 Arduino 接口能让开发板与 WiFi 模块「无缝衔接」,值得一提的是,这款开发板还自带了 ST-LINK 和 USB 串口,这就意味着:只需要一根 Mini-USB 线,就能完成开发和调试工作。 快速入门:[Getting started with STM32 Nucleo board software development tools](https://www.st.com/resource/en/user_manual/dm00105928.pdf) 原理图下载:[STM32 Nucleo (64 pins) schematics](https://www.st.com/resource/en/schematic_pack/nucleo_64pins_sch.zip) *更多相关信息资料见 ST 官网详情页:[STM32 Nucleo-64 development board with STM32F401RE MCU](https://www.st.com/zh/evaluation-tools/nucleo-f401re.html)* #### RW007 RW007 是由上海睿赛德电子科技有限公司开发的高速 WiFi 模块,模块基于 Realtek RTL8710BN(Ameba Z 系列) WIFI SOC,使用 SPI/UART 与主机通信 ,支持 IEEE 802.11b/g/n 网络、 WEP/WPA/WPA2 加密方式和 STA 和 AP 模式。 ![图2 RW007 WiFi 模块](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/rtt-rw007.jpg "RW007 WiFi 模块") ##### 主要特性 * Cortex-M4 高性能 MCU * 可自由选择的 AT SPI 双模式,工作模式可由主机配置 * SPI 时钟高达 30Mbps,UART 波特率高达 6Mbps。 * SPI 模式下有效以太网带宽高达上传 1MBytes/s,下载 1MBytes/s * 内置 Bootloader,支持固件升级、安全固件功能。 * 支持快速连接、airkiss 配网 * 支持存储多达 5 条连接信息 *更多相关信息资料见 RW007 介绍页面:[睿赛德科技推出高速Wi-Fi模块RW007:内置RT-Thread物联网操作系统](https://mp.weixin.qq.com/s/HYHoMnOhzad2m6IBS2Z-Qg)* ##### 工作模式说明 RW007 可通过 SPI 或 UART 和主机通讯,因此存在 AT 和 SPI 两种工作模式。在 AT 模式下,模块使用内嵌 LWIP 协议栈,用户通过 AT 指令实现「开箱即用」。SPI 模式下,模块与主机间高速透传以太网帧,需要在主机端实现网络协议栈及相关驱动。 两种模式通过 `BOOT0`、`BOOT1` 引脚切换,由模块在上电时确定启动方式。 | BOOT0 | BOOT1 | 数据类型 | 接口 | 最大速率 | 内置协议栈 | |-------|-------|---------|------|---------|-----------| | 1 | 0 | SPI | RAW | 30Mbps | 否 | | 1 | 1 | UART | AT | 6Mbps | 是 | *注:模块内部带上拉电阻,当 `BOOT0`、`BOOT1` 未连接任何电气线路时,默认为 AT 模式启动。* 由睿赛德推出的 WiFi 模块,可以说是 RT-Thread 的「亲儿子」了,操作系统原生支持,相应的网络组件、WLAN 框架都能完美兼容,在跑 RTT 的板子上使用 RW007,几乎不需要过多配置,即插即用式的使用体验,大大减轻了嵌入式开发者的工作量。 ### 二、准备工作 在把 RW007 畅快跑起来之前,以下准备工作必不可少,你将需要: 1. STM32 Nucleo-64 开发板(或其他支持 RTT 的板子) 2. RW007 WiFi 模块 3. Mini-USB 连接线(连接开发板与电脑) 4. ENV 编译构建环境([安装使用说明](https://www.rt-thread.org/document/site/programming-manual/env/env/)) 5. 开发常用软件(git、Keil5、串口调试等) 6. 一颗爱折腾的心 ![图3 准备工作](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/prepare-work.jpg "准备工作") #### 用的是其他 STM32 开发板? 在文章后半部分,我会以 STM32F401 Nucleo-64 开发板为例,介绍工程配置过程,但这并不意味着只能在这个板子上使用 RW007,事实上,只要抓住配置过程中的几个核心步骤,本文同样适用于其余 STM32 开发板。 所谓的「核心步骤」,是指跟硬件特定芯片型号相关选项,包括下面要将要提到的: 1. 芯片型号的选择 2. 时钟源与主频配置 3. 调试串口 UART 外设选择 4. RW007 驱动 SPI 外设和引脚选择 *关于 UART 和 SPI 设备和引脚选择,bsp 的 README 中给出了「IO 在板级支持包中的映射情况」,再结合原理图上开发板与模块的连接,得到具体设备号和引脚。* 通过 datasheet 和原理图明确以上这些信息,并在配置时做出相应修改,便能使程序兼容你的板子。 ### 三、开始上路 RT-Thread 包含了 RW007 的软件包,用户无需自己编写驱动程序,下面以 SPI 模式(断开模块上 UART 的电阻 R5 和 R7)为例,介绍如何在 STM32F401 Nucleo-64 上驱动 RW007 模块,并完成 AP 扫描、连接等基本 WiFi 功能。 #### 硬件连接 得益于 Nucleo 上的 Arduino 接口,只需把 RW007 往开发板上一插,即可完成了两者的硬件连接。显然,其他带 Arduino 接口的开发板也能直接插,就是这么简单粗暴…… ![图4 开发板连接模块](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/2220bff566f98f35eadbbc66f3781dc.jpg "开发板连接模块") 电路连接示意图如下: ![图5 电路连接示意图](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/line-connect.png "电路连接示意图") 各 IO 接口与功能之间的对应关系表: | STM32 引脚名 | 封装管脚序号 | Arduino 接口序号 | 功能 | |--------------|--------------|------------------|-----------| | PA5 | 21 | D13 | BOOT0/CLK | | PA6 | 22 | D12 | MISO | | PA7 | 23 | D11 | MOSI | | PB6 | 58 | D10 | BOOT1/CS | | PC7 | 38 | D9 | INT/BUSY | | PA9 | 42 | D8 | RESET | #### STM32 bsp 配置(Menuconfig) 首先从 Github 上克隆 RT-Thread 源代码仓库:[RT-Thread/rt-thread: RT-Thread is an open source IoT operating system from China.](https://github.com/RT-Thread/rt-thread) 打开 `rt-thread\bsp` 目录,能看到 RT-Thread 所支持的所有芯片类型,STM32 作为使用最多的 MCU,当然也在列表内,把 RT-Thread 在 STM32 上跑起来应该不是一件难事,但在编译内核组件之前,要先对 bsp 进行简单配置(别慌,通过 Menuconfig 图形化界面即可完成)。 本次实验所使用的 bsp 为 `stm32f4xx-HAL`,Github 仓库链接:[rt-thread/bsp/stm32f4xx-HAL at master · RT-Thread/rt-thread](https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32f4xx-HAL) 进入 `rt-thread\bsp\stm32f4xx-HAL` 文件夹,右键打开 ENV 窗口(前提是已在 Windows 下搭好 ENV 环境),输入 `pkgs --upgrade` 更新 ENV 和软件包,再输入 `menuconfig` 进行系统配置: *提示:`stm32f40x` 为老版本 bsp,请使用新架构的 `stm32f4xx-HAL`。* ![图6 menuconfig 界面](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/5eac4fbaa5fdd5df9a1db2e6ba16302.png "menuconfig 界面") 附 Menuconfig 常用操作按键: | 按键 | ↑↓ | ←→ | Enter | 空格 | Esc | |------ |---------|---------|-------|----------|------| | 功能 | 列表选择 | 菜单选择 | 确认 | 选中/取消 | 后退 | **1. 选择芯片型号** `stm32f4xx-HAL` 为 M4 通用 bsp,使用前必须指定具体型号,进入 `Device type` 选项,在列表下方选择 `STM32F401RE`: ![图7 选择芯片型号](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/device-type.png "选择芯片型号") **2. 配置内部时钟** 由于 Nucleo 开发板没有焊接外部晶振,需要使能 STM32 的内部高速时钟(HSI),勾选 `Using HSI as clock source`,并把下方的 `System Clock Value` 时钟频率改为 84000000(84MHz)—— STM32F401RE 的最大主频: ![图8 使能 HSI](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/ebdd3f679c2b86762bdab8e9feb29e4.png "使能 HSI") ![图9 配置时钟频率](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/frequency-set.png "配置时钟频率") **3. 开启调试串口** FinSH 控制台组件依赖串口设备工作,通过原理图得知板载 USB 串口接在 UART2,勾选 `Using UART2` 选项,开启调试串口,同时取消其他没有用到的串口: ![图10 开启调试串口](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/open-uart2.png "开启调试串口") **4. 配置 RW007 软件包** RT-Thread 通过软件包的形式,对 RW007 模块提供配套驱动支持,系统默认选项不包含软件包,用户需手动开启:依次进入 `RT-Thread online packages ---> `、`IoT - internet of things --->`、`Wi-Fi --->`,勾选 `rw007: SPI WIFI rw007 driver --->` 选项: ![图11 使用 RW007 软件包](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/use-rw007-pkg.png "使用 RW007 软件包") *RW007 软件包 Github 仓库链接:[RT-Thread-packages/rw007: RW007 (SPI Wi-Fi module) driver for RT-Thread](https://github.com/RT-Thread-packages/rw007)* 紧接着按下 `Enter` 键进一步设置软件包参数,完成 SPI 总线和 IO 的配置,更改总线设备名称 `RW007 BUS NAME` 为 `spi1`: ![图12 更改 SPI 总线名称](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/change-spi-bus-name.png "更改 SPI 总线名称") 接着配置 SPI 控制 IO,各管脚号依次按下表填入: | 引脚号 | 功能 | |-------|---------------------------------------| | 58 | CS pin index | | 21 | BOOT0 pin index (same as spi clk pin) | | 58 | BOOT1 pin index (same as spi cs pin) | | 38 | INT/BUSY pin index | | 42 | RESET pin index | ![图13 配置 SPI 引脚](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/spi-pin-set.png "配置 SPI 引脚") **注意:** * **这里使用纯数字表示管脚号,是指芯片封装的管脚排列序号,在数据手册的封装图中能看到,与常见的 `PAx`、`PBx` 表示法稍有区别。** * **管脚号必须严格按照原理图来配置(开发板与模块的硬件连接),否则会导致系统初始化失败,程序出错!** **5. 开启 WiFi 框架** RW007 驱动使用了 WLAN 相关的接口,按以下选项路径打开 WiFi 框架:`RT-Thread Components --->`、`Device Drivers --->`、`Using WiFi --->`,勾选 `Using Wi-Fi framework`: ![图14 开启 WiFi 框架](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/using-wifi-framework.png "开启 WiFi 框架") **6. 保存 Menuconfig 配置** 完成了上面的 5 步,bsp 配置算大功告成了,但最最重要的一步不能漏 —— 保存 Menuconfig 配置:直接一路狂按 `Esc` 键退出,在保存提示窗口中选择 `Yes` 确认即可: ![图15 保存 Menuconfig 配置](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/save-menuconfig.png "保存 Menuconfig 配置") #### 编译烧写固件 **1. 更新本地软件包** 根据 RT-Thread 的软件包机制,在 Menucofnig 选中了软件包后,相关代码文件并未添加到工程中。在 ENV 终端输入 `pkgs --update` 命令,便能从服务器下载所选软件包,更新到本地目录: ![图 下载更新本地软件包](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/9f3e3cfb09286801ec2cfca85e64cb6.png "下载更新本地软件包") **2. 生成 MDK5 项目文件** 使用 Keil IDE 可以十分方便对 STM32 程序编译和烧录,在 ENV 终端输入 `scons --target=mdk5 -s`,生成 Keil5 工程文件: ![图 生成 MDK5 项目文件](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/1643ded5909a7c64b6dca74534bceda.png "生成 MDK5 项目文件") **3. 配置 Keil 工程选项** 使用 Keil5 打开 bsp 目录下生成的工程文件 `project.uvprojx`,在工程选项 `Options for Target 'rt-thread_stm32f4xx'` 中完成如下配置: 切换至 `Device` 选项卡,选择设备型号 `STM32F401RETx`: ![图 选择芯片型号](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/015d21d32f6d47009cd46b0c1233e48.png "选择芯片型号") 切换至 `Debug` 选项卡,选择 `ST-Link Debugger` 调试器: ![图 选择调试器](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/117fc5b1a7359459750997d78df6c88.png "选择调试器") 同时点击旁边的 `Settings` 按钮,在 `Flash Download` 选项卡中勾选 `Reset and Run`: ![图 勾选复位启动](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/b2752b88ca1c227f6c2100616b6be85.png "勾选复位启动") **注意:每次修改 Menuconfig 后都需要重新生成 MDK5 工程文件,且重新配置 Keil 工程选项,否则会产生严重编译错误(也就几百个 errors 这样子吧)!** *想偷懒的话,不妨试试我已经配置好的 BSP:[rw007_stm32f4xx-HAL.7z - 提取码: hxig](https://pan.baidu.com/s/1RAfIJQt65Ibe-faRq7tAVA),如果软件包不是最新,可以手动从 Github 下载代码覆盖更新。* **4. 编译、下载工程** 使用工具栏的 `Build` 按钮编译工程,出现 `0 Error(s)` 表示编译成功,将开发板连接电脑,再点击 `Download` 按钮下载固件到开发板,完成上面所有步骤后,接下来就是见证奇迹的时刻了。 #### 运行、测试模块功能 勾选 `Reset and Run` 选项后,下载完程序便能自动复位运行,打开串口工具(推荐使用 XShell 等交互型终端),设置参数为 `115200, 8, 1, None`。若系统启动正常,且开发板与模块间的通讯也没有问题,会看到如下初始化打印信息: ``` \ | / - RT - Thread Operating System / | \ 4.0.1 build Mar 1 2019 2006 - 2019 Copyright by rt-thread team lwIP-2.0.2 initialized! [I/WLAN.dev] wlan init success [I/WLAN.lwip] eth device init ok name:w0 rw007 sn: [rw0072795b24400ad48] rw007 ver: [1.2.0] msh > ``` 使用 `wifi scan` 命令扫描周边热点、`wifi join ssid password` 命令连接路由、`ifconfig` 命令查看网络配置,验证模块功能: ![图 测试模块功能](https://raw.githubusercontent.com/shaoguoji/blogpic/master/post-img/run-test.gif "测试模块功能") ### 四、常见问题与解决方法 * **没看到 Device type 选项?** 估计是 BSP 没选对,检查所使用的 BSP 是否为最新版本,一些旧版本 SDK 的 Menuconfig 就没有 Device type 选项。 * **Menuconfig 中没看到 rw007 pkg?** ENV 和 包索引不是最新,执行 `pkgs --upgrade` 命令更新软件包源。 * **Keil 编出一堆错误?** 查看 Keil 工程选项的设备型号是否正确,MDK 与 IAR scons 生成完成工程之后,一定要在工程中手动选择一次芯片信号,否则会产生严重编译错误。 * **运行后串口无输出?** 1. 检查开发板与电脑的连接是否正常 2. 检查串口工具参数配置,应为 `115200, 8, 1, None` 3. 确保 Menuconfig 中选中 UART2 * **运行出现 `wspi` device not found** 确认 RW007 软件包中总线的设备名为 `spi1`,否则会导致设备挂载失败。 ### 五、总结 文章略长,为了能巨细无遗地描述清楚使用 RW007 的每一步骤,难以避免出现大量冗余、甚至过于臃肿,但如果你一步步操作下来,会发现实际上过程并不算繁杂。 得益于 RT-Thread 对系统功能的抽象化、组件化,避免了重复造轮子的工作,这时如何用轮子、用好轮子,就是值得投入时间精力的一件事情了,但一想到能提高嵌入式软件的可复用性、规范性,我认为这些付出是值得的。
查看更多
14
个回答
默认排序
按发布时间排序
armink
2019-03-01
这家伙很懒,什么也没写!
赞,可以试试 STM32 全新 BSP
国际哥
2019-03-01
这家伙很懒,什么也没写!
>赞,可以试试 STM32 全新 BSP --- 在哪个目录?还不太熟:P
armink
2019-03-01
这家伙很懒,什么也没写!
>在哪个目录?还不太熟 --- /bsp/stm32/...
liu2guang
认证专家
2019-03-01
这家伙很懒,什么也没写!
给大佬点赞,棒棒的
whj467467222
认证专家
2019-03-02
开源,分享,交流,共同进步
厉害厉害
271359695
2019-03-19
这家伙很懒,什么也没写!
大佬,可以回答一下论坛rw007配置的这个问题吗?[https://www.rt-thread.org/qa/forum.php?mod=viewthread&tid=10624&highlight=rw007](https://www.rt-thread.org/qa/forum.php?mod=viewthread&tid=10624&highlight=rw007)
zenith1032
2019-05-09
这家伙很懒,什么也没写!
大佬,想请问,用你提供的bsp,能连上wifi,但ifconfig回车显示command not found,是什么原因呢??
jw__liu
2019-05-09
这家伙很懒,什么也没写!
mark·
sober
2019-05-31
这家伙很懒,什么也没写!
>赞,可以试试 STM32 全新 BSP --- RW007模块在哪买
armink
2019-06-01
这家伙很懒,什么也没写!
>RW007模块在哪买 --- 淘宝
撰写答案
登录
注册新账号
关注者
0
被浏览
5.5k
关于作者
国际哥
这家伙很懒,什么也没写!
提问
3
回答
86
被采纳
4
关注TA
发私信
相关问题
1
lwip1.4.1连接经常会断开无法连接上,可以ping通
2
LPC1768:RTT+LWIP+webserver用IE刷网页出现硬件中断错误(已经解决)
3
求一些LWIP开发的经验,目前ping一直不稳定。
4
stm32f207+dp83848无法ping通
5
RTT下的LWIP传递机制
6
rtt内lwip的socket是否是线程安全?
7
Lwip+enc28j60无法ping通
8
坑爹的rtconfig.h lwip关掉了checksum
9
花了一个晚上,把RT2.0的LWIP、网卡驱动、文件系统整合起来了,发现一点小问题
10
lwip例程中udp发送时如何指定源端口发送到指定目的地端口
推荐文章
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
GD32F450 片内 flash驱动适配
2
STM32H7R7运行CherryUSB
3
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
4
使用RC522软件包驱动FM1722
5
常量数据类型和表达式陷阱分享
热门标签
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
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部