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完全够用。我建议你两个都装上,反正不冲突。
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稍微麻烦一点。主要是许可证管理。我个人建议:
- 下载IAR for ARM 8.50.9或更新版本。
- 安装时选择“Full Installation”,别省空间。
- 破解时注意:IAR的许可证是绑定网卡MAC地址的。如果你换了电脑或者用了虚拟机,许可证会失效。
2.4 STM32CubeMX配置:生成你的第一个工程
STM32CubeMX是个好东西。它帮你省掉了最烦人的底层配置。咱们这个项目,需要配置的基本就这几样:
| 外设 | 配置内容 | 说明 |
|---|---|---|
| RCC | HSE + LSE | 外部晶振,8MHz主晶振 + 32.768kHz RTC晶振 |
| USART1 | 115200波特率,8N1 | 用于和蓝牙模块通信 |
| USART2 | 115200波特率,8N1 | 用于调试信息输出(可选) |
| GPIO | PB0、PB1作为LED输出 | 状态指示 |
| NVIC | 使能USART1中断 | 接收蓝牙数据用 |
操作步骤很简单:
- 打开CubeMX,新建工程,选择STM32F103C8T6。
- 在Pinout & Configuration页面,按上表配置。
- 时钟配置页面,HCLK设为72MHz。
- Project Manager页面,选择MDK-ARM V5工具链。
- 点击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
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
创建模板的步骤:
- 用CubeMX生成一个基础工程,配置好时钟、USART、GPIO。
- 把BLE-Stack的hal、osal、stack文件夹复制到工程目录下。
- 在Keil里添加所有.c文件,配置好头文件路径。
- 写一个空的main函数,里面只初始化外设和蓝牙协议栈。
- 编译通过后,把这个工程另存为模板。
2.7 避坑指南:我踩过的那些坑
最后,分享几个我实际遇到过的坑,你遇到了别慌:
- 编译报错“Undefined symbol”:八成是某个.c文件没添加到工程里。去Project窗口检查一下。
- 下载程序后芯片没反应:先检查BOOT0和BOOT1引脚电平。我有一块板子,BOOT0没拉低,结果一直进系统存储器模式。
- 蓝牙模块不响应AT指令:波特率对不对?HC-08默认是9600,CC2541默认是115200。我经常忘记改。
- Keil编译速度特别慢:把“Browse Information”关掉,能快一倍。在Options for Target -> Output -> Browse Information里取消勾选。
好了,环境搭建就到这里。下一章咱们开始写代码,让蓝牙模块和手机连起来。你先把环境搭好,有问题随时翻这一章。