STM32 Nucleo-64 开发板连接 RW007 WiFi 模块

助力万物互联,RW007 上手体验

Posted by Shao Guoji on February 26, 2019

一、简介

本文使用 STM32 Nucleo 开发板连接 RW007 WiFi 模块,通过运行 RT-Thread 操作系统,让开发板轻松愉快联网。

STM32F401 Nucleo-64

STM32 Nucleo-64 是 ST 官方推出的开发板,依据搭载的 STM32 芯片型号不同(皆为 LQFP64 封装),分为众多版本,本文所使用的是带 STM32F401RE 芯片的板子 —— STM32F401 Nucleo-64

图1 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

原理图下载:STM32 Nucleo (64 pins) schematics

更多相关信息资料见 ST 官网详情页:STM32 Nucleo-64 development board with STM32F401RE MCU

RW007

RW007 是由上海睿赛德电子科技有限公司开发的高速 WiFi 模块,模块基于 Realtek RTL8710BN(Ameba Z 系列) WIFI SOC,使用 SPI/UART 与主机通信 ,支持 IEEE 802.11b/g/n 网络、 WEP/WPA/WPA2 加密方式和 STA 和 AP 模式。

图2 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物联网操作系统

工作模式说明

RW007 可通过 SPI 或 UART 和主机通讯,因此存在 AT 和 SPI 两种工作模式。在 AT 模式下,模块使用内嵌 LWIP 协议栈,用户通过 AT 指令实现「开箱即用」。SPI 模式下,模块与主机间高速透传以太网帧,需要在主机端实现网络协议栈及相关驱动。

两种模式通过 BOOT0BOOT1 引脚切换,由模块在上电时确定启动方式。

BOOT0 BOOT1 数据类型 接口 最大速率 内置协议栈
1 0 SPI RAW 30Mbps
1 1 UART AT 6Mbps

注:模块内部带上拉电阻,当 BOOT0BOOT1 未连接任何电气线路时,默认为 AT 模式启动。

由睿赛德推出的 WiFi 模块,可以说是 RT-Thread 的「亲儿子」了,操作系统原生支持,相应的网络组件、WLAN 框架都能完美兼容,在跑 RTT 的板子上使用 RW007,几乎不需要过多配置,即插即用式的使用体验,大大减轻了嵌入式开发者的工作量。


二、准备工作

在把 RW007 畅快跑起来之前,以下准备工作必不可少,你将需要:

  1. STM32 Nucleo-64 开发板(或其他支持 RTT 的板子)
  2. RW007 WiFi 模块
  3. Mini-USB 连接线(连接开发板与电脑)
  4. ENV 编译构建环境(安装使用说明
  5. 开发常用软件(git、Keil5、串口调试等)
  6. 一颗爱折腾的心

图3 准备工作

用的是其他 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 开发板连接模块

电路连接示意图如下:

图5 电路连接示意图

各 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.

打开 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

进入 rt-thread\bsp\stm32f4xx-HAL 文件夹,右键打开 ENV 窗口(前提是已在 Windows 下搭好 ENV 环境),输入 pkgs --upgrade 更新 ENV 和软件包,再输入 menuconfig 进行系统配置:

提示:stm32f40x 为老版本 bsp,请使用新架构的 stm32f4xx-HAL

图6 menuconfig 界面

附 Menuconfig 常用操作按键:

按键 ↑↓ ←→ Enter 空格 Esc
功能 列表选择 菜单选择 确认 选中/取消 后退

1. 选择芯片型号

stm32f4xx-HAL 为 M4 通用 bsp,使用前必须指定具体型号,进入 Device type 选项,在列表下方选择 STM32F401RE

图7 选择芯片型号

2. 配置内部时钟

由于 Nucleo 开发板没有焊接外部晶振,需要使能 STM32 的内部高速时钟(HSI),勾选 Using HSI as clock source,并把下方的 System Clock Value 时钟频率改为 84000000(84MHz)—— STM32F401RE 的最大主频:

图8 使能 HSI

图9 配置时钟频率

3. 开启调试串口

FinSH 控制台组件依赖串口设备工作,通过原理图得知板载 USB 串口接在 UART2,勾选 Using UART2 选项,开启调试串口,同时取消其他没有用到的串口:

图10 开启调试串口

4. 配置 RW007 软件包

RT-Thread 通过软件包的形式,对 RW007 模块提供配套驱动支持,系统默认选项不包含软件包,用户需手动开启:依次进入 RT-Thread online packages ---> IoT - internet of things --->Wi-Fi --->,勾选 rw007: SPI WIFI rw007 driver ---> 选项:

图11 使用 RW007 软件包

RW007 软件包 Github 仓库链接:RT-Thread-packages/rw007: RW007 (SPI Wi-Fi module) driver for RT-Thread

紧接着按下 Enter 键进一步设置软件包参数,完成 SPI 总线和 IO 的配置,更改总线设备名称 RW007 BUS NAMEspi1

图12 更改 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 引脚

注意:

  • 这里使用纯数字表示管脚号,是指芯片封装的管脚排列序号,在数据手册的封装图中能看到,与常见的 PAxPBx 表示法稍有区别。
  • 管脚号必须严格按照原理图来配置(开发板与模块的硬件连接),否则会导致系统初始化失败,程序出错!

5. 开启 WiFi 框架

RW007 驱动使用了 WLAN 相关的接口,按以下选项路径打开 WiFi 框架:RT-Thread Components --->Device Drivers --->Using WiFi --->,勾选 Using Wi-Fi framework

图14 开启 WiFi 框架

6. 保存 Menuconfig 配置

完成了上面的 5 步,bsp 配置算大功告成了,但最最重要的一步不能漏 —— 保存 Menuconfig 配置:直接一路狂按 Esc 键退出,在保存提示窗口中选择 Yes 确认即可:

图15 保存 Menuconfig 配置

编译烧写固件

1. 更新本地软件包

根据 RT-Thread 的软件包机制,在 Menucofnig 选中了软件包后,相关代码文件并未添加到工程中。在 ENV 终端输入 pkgs --update 命令,便能从服务器下载所选软件包,更新到本地目录:

图16 下载更新本地软件包

2. 生成 MDK5 项目文件

使用 Keil IDE 可以十分方便对 STM32 程序编译和烧录,在 ENV 终端输入 scons --target=mdk5 -s,生成 Keil5 工程文件:

图17 生成 MDK5 项目文件

3. 配置 Keil 工程选项

使用 Keil5 打开 bsp 目录下生成的工程文件 project.uvprojx,在工程选项 Options for Target 'rt-thread_stm32f4xx' 中完成如下配置:

切换至 Device 选项卡,选择设备型号 STM32F401RETx

图18 选择芯片型号

切换至 Debug 选项卡,选择 ST-Link Debugger 调试器:

图19 选择调试器

同时点击旁边的 Settings 按钮,在 Flash Download 选项卡中勾选 Reset and Run

图20 勾选复位启动

注意:每次修改 Menuconfig 后都需要重新生成 MDK5 工程文件,且重新配置 Keil 工程选项,否则会产生严重编译错误(也就几百个 errors 这样子吧)!

想偷懒的话,不妨试试我已经配置好的 BSP:rw007_stm32f4xx-HAL.7z - 提取码: hxig,如果软件包不是最新,可以手动从 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 命令查看网络配置,验证模块功能:

图21 测试模块功能


四、常见问题与解决方法

  • 没看到 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 对系统功能的抽象化、组件化,避免了重复造轮子的工作,这时如何用轮子、用好轮子,就是值得投入时间精力的一件事情了,但一想到能提高嵌入式软件的可复用性、规范性,我认为这些付出是值得的。