Skip to content

LV020-ATK-MW8266D硬件连接与工程配置 ​

ATK-MW8266D 是正点原子基于 ATK-ESP-01 模组做的 UART-WIFI 转接板,模块内部跑 AT 固件和 TCP/IP 协议栈,MCU 侧只需要一个普通串口。这一篇只讲两件事:模块怎么接到战舰 V3 开发板上,以及 STM32CubeMX 里怎么把外设配到能通 AT 指令。驱动的收发机制、判帧逻辑与移植改造放在LV025-ATK-MW8266D驱动实现里讲。

一、模块与硬件接口 ​

1. 模块定位与关键参数 ​

ATK-MW8266D 是正点原子基于自研 ATK-ESP-01 模组(核心芯片 ESP8266EX)做的 UART-WIFI 转接板。模块出厂即烧好 AT 指令固件,MCU 侧只需要一个串口:发 AT 指令配置网络,之后收发数据全走同一根串口链路,TCP/IP 协议栈在模块内部,STM32 不参与。

项目参数
无线标准IEEE 802.11 b/g/n,2.412 ~ 2.484 GHz(仅 2.4 GHz 频段)
工作模式STA、AP、STA+AP,出厂默认 AP
串口默认参数115200 bps,8 数据位,1 停止位,无校验(8N1)
串口电平3.3 V LVTTL
供电3.3 V ~ 5 V
功耗正常平均约 12 mA、峰值 200 mA;持续发送平均约 70 mA
无线安全WEP、WPA-PSK、WPA2-PSK;WEP64/128、TKIP、AES
同时 TCP 客户端数5 个
尺寸19 mm × 29 mm,6 个 2.54 mm 排针

两条要记住的数据:串口是 3.3 V LVTTL 电平(不能直接接 RS232),峰值电流 200 mA(供电余量要留够)。

模块本身的资料、三种工作模式的差异,见 LV001-ESP8266模块简介,这里只留接线与配置必需的部分。

2. 引脚定义 ​

序号名称说明
1VCC电源,3.3 V ~ 5 V
2GND电源地
3TXD模块串口发送,接 MCU 的 RX
4RXD模块串口接收,接 MCU 的 TX
5RST复位,低电平有效
6IO_0固件烧写模式选择:低电平进烧写模式,高电平为运行模式(默认)

【注意】

IO_0 悬空即为运行模式。如果把它接到某个默认为低的引脚上,模块上电后不会跑固件,表现为"串口毫无反应",排查时极易被误判成模块损坏。需要重新烧写固件时才把它拉低,流程见 LV015-ESP8266固件烧录。

3. 与战舰 V3 开发板的连接 ​

模块可以直接插到开发板板载的 ATK MODULE 座,对应的连接关系如下:

ATK-MODULE 接口连接关系
模块引脚开发板引脚说明
VCC3.3V / 5V模块自带 LDO,两种都可用
GNDGND
TXDPB11即 USART3_RX
RXDPB10即 USART3_TX
RSTPA4普通 GPIO 输出即可
IO_0不接悬空 = 运行模式

战舰 V3 上 PB10/PB11 与 GBC 接口共用,必须把 P8 排针处的两个跳线帽短接(PB10 ↔ GBC_RX、PB11 ↔ GBC_TX),否则 ATK MODULE 座与 USART3 之间是断的:

P8 跳线帽短接

这一步漏了,现象是"接线全对、AT 指令全无响应"。

4. 供电与电平注意事项 ​

(1)模块峰值电流 200 mA,且 WIFI 发射是突发式的。不要从 MCU 的 VDDA 或调试器 3.3 V 引脚取电,应由开发板板载 LDO 的 3.3 V 供电,或独立 3.3 V 电源,并在模块 VCC 就近放 10 µF + 0.1 µF 去耦。

(2)供电不足的典型症状不是"不工作",而是偶发重启、AT 响应时有时无、连接 AP 阶段失联——很容易误判成软件时序问题。

(3)串口电平 3.3 V,直接对接 STM32 的 3.3 V IO,无需电平转换;5 V 单片机的 TX 直连模块 RXD 也通常可用(模块 IO 耐 5 V 输入),但反向 RX 侧要确认电平门限。

二、STM32CubeMX 工程配置 ​

1. 时钟树 ​

战舰 V3 板载 8 MHz 晶振,目标是 72 MHz 主频:

(1)System Core → RCC:High Speed Clock (HSE) 选 Crystal/Ceramic Resonator;LSE 不用可保持 Disable。

(2)Clock Configuration 页按下面三项核对,其余由 CubeMX 自动推算:

项目目标值说明
SYSCLK72 MHzHSE 8 MHz × PLLMUL 9
HCLK (AHB)72 MHzAHB Prescaler = 1
APB1 Prescaler/2 → 36 MHzUSART3 挂在 APB1,不能超过 36 MHz
APB2 Prescaler/1 → 72 MHzUSART1 挂 APB2

(3)System Core → SYS:Debug 选 Serial Wire,否则第二次烧写会连不上。

USART3 的波特率由 PCLK1 = 36 MHz 分频得到,改 APB1 分频就等于改波特率——这是"代码里明明写了 115200、实际却乱码"的常见来源。

2. USART3 参数 ​

(1)Connectivity → USART3:Mode 选 Asynchronous。此时 CubeMX 自动把 PB10 配成 USART3_TX、PB11 配成 USART3_RX,无需手动指定引脚。

(2)Parameter Settings 按模块出厂参数填写:

参数取值
Baud Rate115200 Bits/s
Word Length8 Bits (including Parity)
ParityNone
Stop Bits1
Data DirectionReceive and Transmit
Over Sampling16 Samples
其余(Advanced Features)全部 Disable

(3)DMA Settings 保持为空。本驱动不用 DMA,全在中断里逐字节收。

(4)GPIO Settings 保持 CubeMX 默认即可:TX 为 Alternate function push pull,RX 为 Input,均为 No pull。原厂代码 RX 用的是普通 GPIO_MODE_INPUT,与 CubeMX 生成的一致,不需要手改。

(5)若之前用 AT+UART 改过模块波特率,这里必须同步改,否则整条链路静默。

3. 中断与优先级 ​

(1)USART3 → NVIC Settings:勾选 USART3 global interrupt。这一步只负责生成 HAL_NVIC_EnableIRQ(USART3_IRQn),不会帮你使能 RXNE/IDLE 位,那两个使能位要手写,见下一篇。

(2)System Core → NVIC → Code generation:Priority Group 选 4 bits for pre-emption priority(对应 NVIC_PRIORITYGROUP_4)。

(3)优先级分配建议:

中断Preemption Priority说明
USART30 或 1与模块通信,判帧靠及时性
USART13调试口,可低
SysTick(HAL 时基)15(默认)数值越大优先级越低

数字越小优先级越高。USART3 设为 0~1 即可,注意不要在 USART3 中断里调用 HAL_Delay():SysTick 优先级更低,会被一直抢占,HAL_Delay 永远等不到 tick 前进。

原厂工程用的是 NVIC 组 2(2 位抢占),CubeMX 默认组 4(4 位抢占)。两者在"只有一个中断源需要抢占"的场景下功能等价,不必刻意对齐,只要保证 USART3 抢占优先级数值最小。

4. RST 引脚 ​

(1)在引脚图上点 PA4,选 GPIO_Output。

(2)System Core → GPIO → PA4 按下面配置:

项目取值原因
GPIO output levelHigh上电即高,模块处于运行态;低电平会一直复位
GPIO modeOutput Push Pull推挽驱动,无需上拉
GPIO Pull-up/Pull-downNo pull-up and no pull-down模块内部已有上下拉
Maximum output speedHigh复位脉冲边沿要干净
User LabelATK_ESP_RST生成 ATK_ESP_RST_Pin / ATK_ESP_RST_GPIO_Port 宏

配好之后 MX_GPIO_Init() 生成的代码是"先把输出电平写成高,再把引脚切成输出",这个顺序正是我们要的——切模式的瞬间引脚就已经是高电平,不会出现一个低电平毛刺把模块按在复位里:

c
// Core/Src/gpio.c
/* Configure GPIO pin Output Level */
HAL_GPIO_WritePin(ATK_ESP_RST_GPIO_Port, ATK_ESP_RST_Pin, GPIO_PIN_SET);

/* Configure GPIO pin : ATK_ESP_RST_Pin */
GPIO_InitStruct.Pin   = ATK_ESP_RST_Pin;
GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull  = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(ATK_ESP_RST_GPIO_Port, &GPIO_InitStruct);

【注意】

GPIO output level 必须是 High。这一项默认是 Low,漏改的现象是"模块一直被按在复位里,AT 指令全无响应",且看上去和"模块坏了"完全一样。这个引脚必须在 .ioc 里配置,不要手写进 gpio.c 的 USER CODE 区,否则每次重新生成都要补一遍。

5. 调试串口与 printf ​

建议保留一个独立调试口(战舰 V3 上是 USART1,PA9/PA10),115200 8N1,用于打印日志。不要把模块串口同时也接到串口助手:AT 回显、模块主动上报的 WIFI CONNECTED、透传数据会与调试日志搅在一起,完全没法看。

printf 重定向有两种写法,二选一:

方案操作说明
MicroLIBTarget 选项勾 Use MicroLIB,只重写 fputc()最省事,新工程推荐
标准库不勾 MicroLIB,需 __use_no_semihosting + 实现 _ttywrch/_sys_exit/_sys_command_string + fputc()原厂 usart.c 用的是这套

重定向到 USART1 的示例(CubeMX 工程,配合 huart1):

c
// Core/Src/usart.c(放在 USER CODE 区,防止重新生成时被覆盖)
int fputc(int ch, FILE *f)
{
    (void)f;
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
    return ch;
}

6. 代码生成选项 ​

Project Manager 页三处必做:

(1)Code Generator → 勾选 Generate peripheral initialization as a pair of '.c/.h' files per peripheral。这样会生成 Core/Src/usart.c 与 Core/Inc/usart.h,驱动里 #include "usart.h" 就能拿到 extern UART_HandleTypeDef huart3,不必去翻 main.c。

(2)勾选 Keep User Code when re-generating(默认已勾)。驱动代码全部写在 USER CODE BEGIN/END 区内。

(3)不要勾选会删除既有文件的选项(Delete previously generated files when not re-generated)。

Toolchain/IDE 按需选 MDK-ARM(V5)或 Makefile。

7. 上电前核对表 ​

检查项期望
SYSCLK / PCLK172 MHz / 36 MHz
USART3115200、8N1、异步、无流控
NVICUSART3 global interrupt 已勾选
PA4输出、初始高电平、推挽,User Label 为 ATK_ESP_RST(main.h 里有 ATK_ESP_RST_Pin)
P8 跳线帽PB10 ↔ GBC_RX、PB11 ↔ GBC_TX 已短接
模块 VCC3.3 V 或 5 V,供电能力 ≥ 200 mA 峰值
IO_0悬空(高电平 / 运行模式)

到这一步,串口能收能发了,但帧边界所需的 RXNE/IDLE 中断使能、中断里调哪个函数,以及整套驱动的移植改造,都还没做——这些在LV025-ATK-MW8266D驱动实现里继续。