2. 开发环境搭建:Keil/IAR IDE安装、STM32CubeMX配置、蓝牙SDK导入与工程模板创建

好,咱们正式开始动手了。这一章我带你搭开发环境。说实话,很多初学者一上来就急着写代码,结果编译报错半天找不到原因——八成是环境没配好。我当年也吃过这个亏,折腾了一整天,最后发现是路径里有中文。

所以这一章,咱们稳扎稳打。把Keil、IAR、STM32CubeMX、蓝牙SDK,一个一个搞定。最后生成一个干净的工程模板,后面所有实验都基于它。

2.1 IDE的选择:Keil还是IAR?

先聊个老生常谈的问题:用Keil还是IAR?

我个人习惯用Keil MDK,因为它的界面更直观,调试器支持也广。但如果你做低功耗蓝牙项目,尤其是用TI的CC254x或CC26xx系列,IAR其实更稳。为什么呢?因为TI官方的BLE-Stack例程,很多都是基于IAR工程写的。

不过话说回来,咱们这个课程用的是STM32 + 外挂蓝牙模块的方案,所以Keil完全够用。我建议你两个都装上,反正不冲突。

我的建议: 主用Keil MDK 5.38以上版本,IAR作为备用。遇到TI原厂例程时,用IAR打开更省心。

2.2 Keil MDK安装与破解(别笑,这一步真有人卡住)

安装Keil没什么难度,一路Next就行。但有几点我要提醒你:

  • 安装路径不要有中文! 我之前有个学员,装在“D:\软件\Keil_v5”下面,结果编译时头文件死活找不到。后来改成“D:\Keil_v5”就好了。
  • 记得勾选“Add to PATH”,这样命令行里也能调用编译器。
  • 安装完成后,先装好对应芯片的Pack包。 咱们用的是STM32F103系列,所以去Keil官网下载“Keil.STM32F1xx_DFP.2.4.0.pack”或者更新版本。

至于破解……嗯,我不鼓励盗版,但如果你只是学习用,网上有注册机。我当年上学时也是这么过来的。不过现在Keil社区版是免费的,功能也够用,建议优先用社区版。

2.3 IAR Embedded Workbench安装

IAR的安装比Keil稍微麻烦一点。主要是许可证管理。我个人建议:

  1. 下载IAR for ARM 8.50.9或更新版本。
  2. 安装时选择“Full Installation”,别省空间。
  3. 破解时注意:IAR的许可证是绑定网卡MAC地址的。如果你换了电脑或者用了虚拟机,许可证会失效。
注意: 我曾经在虚拟机里装IAR,结果死活激活不了。后来发现是虚拟网卡的MAC地址每次重启都会变。解决办法是固定MAC地址,或者直接用实体机。

2.4 STM32CubeMX配置:生成你的第一个工程

STM32CubeMX是个好东西。它帮你省掉了最烦人的底层配置。咱们这个项目,需要配置的基本就这几样:

外设 配置内容 说明
RCC HSE + LSE 外部晶振,8MHz主晶振 + 32.768kHz RTC晶振
USART1 115200波特率,8N1 用于和蓝牙模块通信
USART2 115200波特率,8N1 用于调试信息输出(可选)
GPIO PB0、PB1作为LED输出 状态指示
NVIC 使能USART1中断 接收蓝牙数据用

操作步骤很简单:

  1. 打开CubeMX,新建工程,选择STM32F103C8T6。
  2. 在Pinout & Configuration页面,按上表配置。
  3. 时钟配置页面,HCLK设为72MHz。
  4. Project Manager页面,选择MDK-ARM V5工具链。
  5. 点击GENERATE CODE,生成工程。

嗯,这里要注意:生成代码时,CubeMX会问你要不要初始化所有外设。我建议选“Yes”,省得自己再写初始化函数。

2.5 蓝牙SDK导入:TI BLE-Stack的坑与技巧

咱们用的是TI的BLE-Stack。虽然课程里用的是外挂蓝牙模块(比如HC-08或CC2541模块),但了解BLE-Stack的结构对你理解蓝牙协议栈很有帮助。

BLE-Stack的下载地址在TI官网,搜索“BLE-Stack 2.5.2”就能找到。下载后解压,你会看到这样的目录结构:

BLE-Stack-2.5.2/
├── Components/
│   ├── hal/          // 硬件抽象层
│   ├── osal/         // 操作系统抽象层
│   └── stack/        // 蓝牙协议栈核心
├── Projects/
│   ├── ble/          // 示例工程
│   └── common/       // 公共文件
└── Documents/        // 文档

导入到Keil工程时,我建议你只复制需要的文件。别一股脑全拷进去,否则编译会报一堆重复定义的错误。我当年第一次导入时,直接把整个Components文件夹拷进去了,结果编译出了200多个错误……

正确做法: 只复制以下三个文件夹到你的工程目录下:
  • Components/hal
  • Components/osal
  • Components/stack
然后在Keil里添加对应的.c文件路径和头文件路径。

2.6 工程模板创建:一次配置,重复使用

这一步很关键。我建议你创建一个“万能模板”,以后每次做新项目,直接复制这个模板,改改配置就行。

我的模板结构是这样的:

BLE_Template/
├── Core/
│   ├── Inc/          // 头文件
│   ├── Src/          // 源文件
│   └── Startup/      // 启动文件
├── Drivers/
│   ├── CMSIS/
│   └── STM32F1xx_HAL_Driver/
├── BLE/
│   ├── hal/          // 蓝牙硬件抽象层
│   ├── osal/         // 蓝牙操作系统抽象层
│   └── stack/        // 蓝牙协议栈
├── User/
│   ├── main.c
│   ├── ble_app.c     // 蓝牙应用层代码
│   └── uart_comm.c   // UART通信代码
└── MDK-ARM/
    └── project.uvprojx

创建模板的步骤:

  1. 用CubeMX生成一个基础工程,配置好时钟、USART、GPIO。
  2. 把BLE-Stack的hal、osal、stack文件夹复制到工程目录下。
  3. 在Keil里添加所有.c文件,配置好头文件路径。
  4. 写一个空的main函数,里面只初始化外设和蓝牙协议栈。
  5. 编译通过后,把这个工程另存为模板。
小技巧: 模板工程编译通过后,把整个文件夹压缩备份。以后每做一个新项目,解压一份,改个名字就能用。我电脑里现在有十几个这样的模板,不同芯片、不同协议栈各一个。

2.7 避坑指南:我踩过的那些坑

最后,分享几个我实际遇到过的坑,你遇到了别慌:

  • 编译报错“Undefined symbol”:八成是某个.c文件没添加到工程里。去Project窗口检查一下。
  • 下载程序后芯片没反应:先检查BOOT0和BOOT1引脚电平。我有一块板子,BOOT0没拉低,结果一直进系统存储器模式。
  • 蓝牙模块不响应AT指令:波特率对不对?HC-08默认是9600,CC2541默认是115200。我经常忘记改。
  • Keil编译速度特别慢:把“Browse Information”关掉,能快一倍。在Options for Target -> Output -> Browse Information里取消勾选。

好了,环境搭建就到这里。下一章咱们开始写代码,让蓝牙模块和手机连起来。你先把环境搭好,有问题随时翻这一章。