找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1835

积分

0

好友

226

主题
发表于 2025-12-31 05:05:28 | 查看: 23| 回复: 0

STM32近年来在无线MCU领域持续发力,推出了包括蓝牙、LoRaWAN等技术的产品线,例如WB0、WL、WB以及WBA系列。其中,WBA系列在资源与性能方面最为突出。

对于传统的STM32 MCU我们已经非常熟悉,但其无线产品尚未体验过。恰好手边有一块NUCLEO-WBA52CG开发板,便拿出来进行初步体验,为后续的蓝牙功能开发做准备。

STM32系列无线MCU规格对比
图1:STM32 WB0/WL/WB/WBA系列无线MCU核心参数与性能对比

NUCLEO-WBA52CG、NUCLEO-WBA55CG 和 NUCLEO-WBA65RI 是支持蓝牙低功耗及超低功耗的评估板,它们嵌入了符合蓝牙 LE SIG 规范、IEEE 802.15.4-2015 PHY 和 MAC 层的强大无线电模块,能够支持 Thread、Matter 和 Zigbee 协议。

需要注意的是,NUCLEO-WBA52CG 是较早的版本,目前已被 NUCLEO-WBA55CG 替代。
相关产品页面:https://www.st.com/en/evaluation-tools/NUCLEO-WBA52CG.html

使用STM32CubeMX创建工程

首先,下载并安装 STM32CubeMX 软件:
https://www.st.com/en/development-tools/stm32cubemx.html

打开 CubeMX 后,选择从开发板(Board Selector)来创建新工程。

STM32CubeMX主界面
图2:STM32CubeMX软件启动界面,可选择从MCU、开发板或示例创建项目

软件可能会开始下载必要的支持包。

软件包下载进度
图3:STM32CubeMX下载硬件支持包进度界面

在开发板列表中,搜索并选中 NUCLEO-WBA52CG,然后点击 Start Project

选择NUCLEO-WBA52CG开发板
图4:在Board Selector中定位并选择NUCLEO-WBA52CG开发板

接下来,在弹出的对话框中选择 without TrustZone activated(不使用TrustZone模式)。

选择TrustZone模式
图5:选择是否启用TrustZone安全扩展

为了快速体验,我们可以加载一个演示(Demo)代码。在项目配置中,选择所需的软件组件,例如多个用户LED和按键。

选择演示软件组件
图6:在软件组件选择界面,勾选LED和按键等演示功能

进入引脚配置(Pinout)视图,可以查看和调整默认的引脚分配。

引脚配置视图
图7:STM32CubeMX的引脚分配与芯片视图

切换到时钟配置(Clock Configuration)页面,可以根据需要调整系统时钟源和频率。

时钟树配置
图8:STM32WBA52的时钟树配置界面

接下来进入项目管理器(Project Manager)。在这里设置工程名称、存储路径,并选择工具链/IDE,这里以MDK-ARM (Keil)为例。

项目基本设置
图9:设置项目名称、路径和选择的集成开发环境

在高级设置中,可以配置堆栈大小、多线程支持等参数。

项目高级设置
图10:项目的高级配置选项,包括内存分配和线程安全设置

在代码生成器(Code Generator)设置中,可以决定库文件的处理方式、是否备份旧文件等。

代码生成器设置
图11:代码生成器的详细选项,控制文件生成行为

在驱动选择器(Driver Selector)中,可以管理不同安全域(如Cortex-M33S/NS)需要初始化的外设驱动。

驱动选择器
图12:为不同的处理器安全域配置需要生成的硬件驱动初始化代码

所有配置完成后,点击 Generate Code 生成工程。

生成工程代码
图13:执行代码生成操作

如果本地没有对应的固件支持包(FW Pack),CubeMX会提示下载。

下载固件包提示
图14:提示下载STM32WBA系列对应的固件库包

接受许可协议,完成安装。

接受固件库许可
图15:安装固件库前需阅读并接受许可协议

代码成功生成后,可以选择直接打开工程或打开所在文件夹。

代码生成成功
图16:代码生成完成提示,并可选择后续操作

使用Keil MDK打开工程并进行编译。

Keil MDK编译输出
图17:在Keil MDK中成功编译项目,无错误无警告

编译无误后,连接开发板,点击 Debug 进入调试模式。

进入调试模式
图18:通过仿真器成功连接芯片并进入调试状态

在调试模式下运行程序(Debug -> Run)。通过串口工具(如配置为虚拟串口的ST-LINK VCP)可以看到打印信息。

串口打印欢迎信息
图19:程序运行后,通过串口打印出的欢迎信息

此时可以观察到板载的LED(LD1)按一定频率闪烁,按下用户按键B1~B3可以改变闪烁频率。
但可能发现LD2(绿色LED)不亮。这是因为NUCLEO-WBA52CG板上LD2的连接引脚与默认示例代码中的定义不同。根据原理图,LD2连接在PB11上,而非默认引脚。这涉及底层C语言编程和硬件操作,需要修改代码中的GPIO引脚定义。

代码中修改GPIO引脚
图20:在工程头文件中修改LED引脚定义的示例代码

开发板部分原理图
图21:NUCLEO-WBA52CG开发板部分原理图,显示LED连接引脚

解决无法连接仿真器的问题

在某些情况下,例如下载了禁用调试接口的固件或其他异常固件后,程序一开始就关闭了调试功能,导致仿真器无法连接。

此时,可以在MDK的调试设置中,将 Reset 模式改为 Under Reset

MDK调试连接设置
图22:在Keil调试配置中设置“Connect Under Reset”模式

然后,按住开发板上的 RESET 按键,再点击MDK中的调试连接按钮。成功连接后,立即下载一个正确的程序。

如果上述方法无效,可以使用ST官方工具 STM32CubeProgrammer 进行连接和擦除。
软件下载地址:https://www.st.com.cn/zh/development-tools/stm32cubeprog.html

使用方法:在STM32CubeProgrammer中,按住板子的 RESET 键,点击 Connect,待连接状态显示后松开 RESET 键。连接成功后,执行全片擦除(Full Chip Erase)操作。

STM32CubeProgrammer擦除芯片
图23:使用STM32CubeProgrammer成功连接并擦除芯片Flash

解决程序需多次运行且断电后无法自启动的问题

这个问题通常与底层IO的配置机制有关。

默认情况下,工程可能使用了半主机(Semihosting)机制。当程序使用底层IO(如printf)时,编译器会插入断点(BKPT)指令。连接仿真器时,程序会在此处暂停,等待调试器处理,继续运行后可以跳过该指令。但如果没有连接仿真器,程序就会永远卡在这个断点指令上,导致无法运行。

解决方案:

在Keil MDK的工程选项 Target 中,勾选 Use MicroLIB 选项。MicroLIB是一个针对嵌入式系统优化的精简C库,默认不使用半主机机制。

启用MicroLIB
图24:在Keil项目Options for Target中勾选“Use MicroLIB”

但勾选后编译可能会报错,出现类似以下未定义符号的错误:

Error: L6218E: Undefined symbol __use_two_region_memory ...
Error: L6218E: Undefined symbol __initial_sp ...

解决方法是执行一次 Clean Targets 操作(Project -> Clean Targets),然后重新编译。

清理目标工程
图25:执行清理目标操作,清除旧的中间文件

完成以上步骤后,程序应能正常下载、调试,并且断电重新上电后可以独立运行。




上一篇:安全服务工程师摸鱼攻略:盘点办公室里的实用小技巧
下一篇:VMware NSX 4.2 主机传输节点配置详解:从理论到实践部署指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-10 09:02 , Processed in 0.274014 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表