这里使用的是 ST-Link 和最小开发板。这种连接方式叫做 SWD (Serial Wire Debug) 接口。相比于串口下载,它不仅速度快,最重要的是支持在线调试(可以实时查看变量、打断点让程序停下)。
接线对照表
- ST-Link 使用到的引脚:
7、9、19、20(尝试这四个引脚,CubeIDE 下载程序时找不到单片机)- 使用引脚 1、20、7、8;并且通过数据线单独给单片机供电
连接后的关键步骤
接好线后,你还需要在电脑端的软件(以 Keil MDK 为例)中进行设置,否则还是识别不到芯片:
- 插上 ST-Link:电脑识别到 ST-Link 驱动。
- 打开 Keil 工程:
- 点击魔术棒图标 (Options for Target)。
- 切换到 Debug 选项卡。
- 在右侧下拉框选择 ST-Link Debugger。
- 进入 Settings 设置 (关键):
- 点击旁边的 Settings 按钮。
- 在 Port 下拉框中,务必将
JTAG改为SW(因为你只接了两根信号线)。 - 如果连接成功,右侧的 SW Device 框里会出现一串十六进制代码(IDCODE),这说明已经成功识别到了你的 STM32 芯片。
关于 BOOT 跳线帽的设置
在使用 ST-Link 下载时,开发板上的黄色跳线帽(BOOT0 和 BOOT1)通常应该这样设置:
- BOOT0 = 0(跳线帽靠近 GND 一端)
- BOOT1 = 0(跳线帽靠近 GND 一端) 这种模式下,程序下载后按一下复位键就能直接从 Flash 运行,最方便。
工程配置
STM32 的 C 代码需要一个“容器”(即工程环境)。如果你只把代码写在一个记事本里,编译器是不知道如何处理硬件底层的
为什么需要“工程配置”
在 51 单片机里,你可能只需要一个 .c 文件就能跑。但在 STM32 里,一个完整的工程必须包含以下四个核心板块:
- 启动文件 (
startup_stm32xxx.s):我们之前讲过的“工厂开工流程”,它是汇编代码。 - CMSIS 库文件:这是 ARM 公司提供的,用来让内核(Cortex-M)认识寄存器地址的。
- HAL/标准库驱动:这是 ST 官方提供的库,让你能用
HAL_GPIO_WritePin这种函数。 - 你的代码 (
main.c):你写的逻辑。
好消息是:现在的开发者通常不需要手动配置这些,这里我们使用 STM32CubeIDE。只需要鼠标点几下,它就会自动为你生成一个配置好的工程容器。
完整操作步骤
第一步:新建工程
- 打开 STM32CubeIDE,点击 File -> New -> STM32 Project。
- 在 Commercial Part Number 框输入你的芯片型号(如
STM32F103C8T6),选中后点击 Next。 - 给项目起个名字(如
Blinky_LED),点击 Finish。
![[Pasted image 20251220153919.png]]
第二步:图形化配置 (ioc 文件)
- 在弹出的芯片引脚图上,找到 PC13 引脚,左键点击它,选择 GPIO_Output。
- (可选)在左侧菜单 System Core -> GPIO 里,点击 PC13,可以给它起个别名(User Label),比如
MY_LED。 - 配置时钟:点击上方的 Clock Configuration 选项卡。通常默认即可,或者在
HCLK框输入72然后按回车,IDE 会自动帮你算好倍频。 - 生成代码:直接按键盘 Ctrl + S 保存,弹窗问是否生成代码,选 Yes。
第三步:开启外部高速晶振(可选)
注意:在 STM32F1 系列中,如果使用内部时钟(HSI),倍频后最高只能达到 64MHz。要达到标准的 72MHz,你必须开启板子上的那个金属晶振。按照下面步骤可开启开发板上的金属晶振:
1、开启 HSE 硬件开关
- 回到 STM32CubeIDE 的 Pinout & Configuration(引脚配置)界面。
- 在左侧菜单栏找到 System Core(系统核心)。
- 点击 RCC。
- 在右侧的 High Speed Clock (HSE) 下拉菜单中,选择 Crystal/Ceramic Resonator(晶体/陶瓷谐振器)。
- 此时你会发现芯片引脚图上的 PD0 和 PD1 变绿了,这说明它们现在连接到了外部晶振。
2、在时钟树中切换路径
- 切换到上方的 Clock Configuration(时钟配置)选项卡。
- 找到 PLL Source Mux(锁相环来源选择器)这个选择框,把点选挪到 HSE 上。
- 确保 PLLMul(倍频系数)被设置为 X 9(因为 $8\text{MHz} \times 9 = 72\text{MHz}$)。
- 在 System Clock Mux(系统时钟选择器)中,选择 PLLCLK。
- 关键点:观察 APB1 Prescaler,确保它的分频系数是 /2。
- 原因:我们在“总线”那一节讲过,APB1 最高只能跑 36MHz。如果系统时钟是 72MHz,这里必须 2 分频。
第四步:编写完整代码
代码生成后,打开左侧项目资源管理器里的 Core -> Src -> main.c。
⚠️ 注意: 在 CubeIDE 中,你必须把代码写在 /* USER CODE BEGIN … */ 和 /* USER CODE END … */ 之间。否则,下次你修改配置重新生成代码时,你的代码会被无情覆盖!
找到 main 函数里的 while(1),填入以下代码:
|
|
第五步:配置调试口
- 打开你的工程里的
.ioc文件。 - 在左侧菜单栏找到 System Core -> SYS。
- 在右侧的 Debug 下拉菜单中,选择 Serial Wire。
- 选完后,你应该能看到引脚图上的 PA13 和 PA14 变绿了,并标注了 SWDIO 和 SWCLK。
- 保存并重新生成代码。
编译、下载与运行
- 编译:点击工具栏上的 “小锤子”图标 (Build)。查看下方 Console 窗口,显示
0 errors, 0 warnings即成功。 - 设置下载器:如果是第一次运行,点击 Run -> Run Configurations…。
- 在 Debugger 选项卡里,确保使用的是 ST-LINK (ST-LINK GDB server)。
- 确保 Interface 选的是 SWD。
- 运行:点击工具栏上的 “绿色右箭头”图标 (Run)。IDE 会自动把程序烧录进开发板。
升级 ST-LINK 固件
- 点击 IDE 菜单 Help -> ST-LINK Firmware Update。
- 点击 Open in update mode。
- 点击 Upgrade 升级固件。
小结:你的第一个工程长什么样
| 文件夹/文件 | 作用 |
|---|---|
| Drivers/CMSIS | 内核核心文件(不用动) |
| Drivers/STM32F1xx_HAL_Driver | HAL 库源码,即 HAL_GPIO_xxx 等函数的定义 |
| Core/Src/main.c | 你的主战场 |
| Core/Src/stm32f1xx_it.c | 处理中断函数的地方 |
| Project_Name.ioc | 可视化配置的源文件,双击它能重新改引脚 |