2、开发环境搭建:安装Keil MDK或STM32CubeIDE,配置工程模板,安装必要的驱动和库文件

好,咱们正式开始动手了。这一章要解决一个最基础的问题——把吃饭的家伙先支棱起来。

嵌入式开发,说白了就是跟芯片打交道。你得有个趁手的工具,才能把代码烧进去、跑起来、看结果。我个人习惯用Keil MDK,但STM32CubeIDE这两年也越来越成熟。你选哪个都行,关键是别在环境搭建上卡太久。

2.1 选哪个?Keil MDK vs STM32CubeIDE

先说说我的看法。如果你刚入门,我建议直接上STM32CubeIDE。为什么?因为它免费,而且集成了CubeMX,图形化配置外设特别方便。Keil MDK虽然老牌,但商用要收费,学生版有代码大小限制。

但如果你以后要去公司干活,很多老项目还是用Keil。我第一份工作进公司,打开工程一看,MDK 5.14,那叫一个怀旧。所以我的建议是:

  • 个人学习、新项目 → STM32CubeIDE
  • 跟公司项目走、兼容旧代码 → Keil MDK

嗯,这里要注意:两个IDE的工程文件不通用。你选了哪个,后面就别来回切了,不然光是移植驱动就能折腾一整天。

2.2 安装Keil MDK(以MDK 5.38为例)

如果你决定用Keil,那咱们一步步来。我曾经帮一个同事装环境,他下载了个精简版,结果调试器死活连不上,折腾了两小时才发现是驱动没装全。所以,别偷懒。

2.2.1 下载与安装

  1. 去Keil官网(www.keil.com)下载MDK-Arm。注意版本,别下成C51了,那是给51单片机用的。
  2. 双击安装包,一路Next。安装路径我建议别带中文,也别放C盘根目录。我习惯放 D:\Keil_v5
  3. 安装完成后,打开Keil uVision5。第一次启动会弹出一个Pack Installer窗口,别关,后面要用。
注意: 安装路径不要有空格和中文。我曾经见过有人装到「D:\我的工具\Keil」,结果编译报错找不到头文件,排查了半天才发现是路径问题。

2.2.2 安装器件支持包(Pack)

Keil本身只是个壳,你得给它装对应芯片的Pack才能用。比如你用STM32F103C8T6,就得装STM32F1系列的Pack。

在Pack Installer里,左侧找到你的芯片型号,右侧点Install。如果网速慢,可以去官网手动下载.pack文件,然后双击安装。

小技巧: 我一般把常用的Pack都下载到本地,比如STM32F1、F4、G0系列。这样换项目时不用重新下载,省时间。

2.2.3 安装调试器驱动

你总得有个东西把程序烧进芯片吧?常用的有J-Link、ST-Link、DAP-Link。

  • ST-Link:买STM32开发板一般都自带,驱动去ST官网下,或者装完STM32CubeProgrammer会自动装好。
  • J-Link:SEGGER官网下载驱动,安装后记得把JLinkARM.dll拷贝到Keil安装目录的ARM\Segger文件夹下。
  • DAP-Link:免驱,但Keil里要选CMSIS-DAP Debugger。

我遇到过最坑的一次:J-Link驱动装好了,Keil里也识别了,但就是连不上板子。后来发现是J-Link固件版本太老,升级了一下就好了。所以,如果你连不上,先看看调试器的固件是不是最新的。

2.3 安装STM32CubeIDE

如果你选STM32CubeIDE,那省心多了。它把编译器、调试器、CubeMX都打包在一起了。

2.3.1 下载与安装

  1. 去ST官网搜索STM32CubeIDE,下载对应操作系统的版本。Windows就下.exe,Linux下.tar.gz。
  2. 安装过程很简单,一路默认就行。它会自动帮你装好ST-Link驱动和GCC编译器。
  3. 第一次启动会提示你选择工作空间(Workspace)。我习惯放 D:\STM32Workspace,别放桌面,不然项目多了乱得很。
重点: STM32CubeIDE基于Eclipse,如果你用过Eclipse开发Java,那上手很快。但如果你之前只用Keil,可能会觉得界面有点花哨。别慌,核心功能就那几个:Project Explorer、Editor、Console。

2.3.2 配置工程模板

我个人习惯建一个空的模板工程,把常用的外设配置好,比如GPIO、UART、定时器。以后每次开新项目,直接复制这个模板,省得每次都要重新配时钟树。

具体做法:

  • 新建一个STM32工程,选好芯片型号。
  • 在CubeMX里配好HSE、LSE、系统时钟(一般先配到最高主频)。
  • 使能UART1(用于打印调试信息),配好GPIO(比如板载LED)。
  • 生成代码,然后把这个工程文件夹压缩保存。下次用的时候解压,改个名字就行。
我的习惯: 模板工程里我还会加一个简单的延时函数(基于SysTick),以及一个printf重定向。这样新项目一开箱就能打印日志,调试效率高很多。

2.4 安装必要的驱动和库文件

环境搭好了,但光有IDE还不够。你得把「跟芯片沟通的桥梁」搭好。

2.4.1 串口驱动(CH340/CP2102)

很多开发板用的是CH340或CP2102做USB转串口。Windows 10以上系统一般能自动识别,但如果识别不了,去官网下驱动手动装。

我遇到过一个问题:CH340驱动装好了,设备管理器里也看到了,但串口助手就是打不开。后来发现是波特率设置不对,板子默认115200,我设成了9600。嗯,这种低级错误犯过一次就不会再犯了。

2.4.2 STM32 HAL库 / LL库

如果你用STM32CubeIDE,HAL库是自动下载的。但如果你用Keil,需要手动添加。

有两种方式:

  • 方式一: 在Keil的Pack Installer里,找到对应芯片的DFP(Device Family Pack),里面包含了HAL库。
  • 方式二: 去ST官网下载STM32CubeF1(或其他系列)的固件包,解压后把Drivers文件夹复制到工程目录下。

我个人推荐方式一,因为Pack会跟着Keil版本更新,兼容性好。方式二适合你不想联网的时候用。

2.4.3 第三方库(如FreeRTOS、FatFS)

如果你的项目要用到操作系统或文件系统,建议提前把库文件准备好。

我一般会在模板工程里预留一个 ThirdParty 文件夹,把常用的库源码放进去。比如:

Project_Template/
├── Core/
│   ├── Inc/
│   └── Src/
├── Drivers/
│   ├── CMSIS/
│   └── STM32F1xx_HAL_Driver/
├── ThirdParty/
│   ├── FreeRTOS/
│   └── FatFS/
└── MDK-ARM/

这样以后加功能,直接复制粘贴,不用再去找库的下载链接。

注意: 不同版本的HAL库和FreeRTOS可能有兼容性问题。我踩过坑:用STM32CubeMX生成的代码里带了HAL库 1.8.0,但我手动替换成了1.7.0,结果定时器回调函数死活不触发。所以,尽量保持库版本一致。

2.5 验证环境是否搭好

环境搭没搭好,跑个点灯程序就知道了。这是嵌入式界的「Hello World」。

新建一个工程,配置好GPIO(比如PA5接LED),写个简单的循环翻转电平:

while (1)
{
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    HAL_Delay(500);
}

编译通过,下载到板子,LED开始闪烁。嗯,成了。

如果LED不亮,别慌。先检查:

  • 板子供电了吗?
  • 调试器连接正确吗?
  • LED对应的GPIO引脚对吗?(很多板子的LED是PB12或PC13,不是PA5)
  • 时钟配置对了吗?(HSE还是HSI?)

我刚开始学的时候,点灯点了三天没亮,最后发现是LED焊反了。所以,硬件问题也要考虑进去。

2.6 本章小结

这一章内容不多,但很重要。环境搭不好,后面全是白搭。

你想想看,IDE装好了,驱动装全了,库文件也备齐了,接下来就可以安心写代码了。下一章咱们开始讲工程结构,怎么组织代码才能让项目不变成一坨浆糊。

好,先到这。去把环境装好,跑个点灯,然后回来继续。