2
0
0
【嵌入式硬件】2.0 STM32F103 HAL库开发实战——用DAP仿真器下载程序
我采用的仿真器为Fire-Debugger,遵循ARM公司的CMSIS-DAP标准,支持所有基于Cortex-M内核的单片机,常见的M3、M4和M7都可以完美支持。
Fire-Debugger支持下载和在线仿真程序,支持XP/WIN7/WIN8/WIN10这四个操作系统,免驱,不需要安装驱动即可使用,支持KEIL和IAR直接下载,非常方便。
## 硬件连接
把仿真器用USB线连接电脑,如果仿真器的灯亮则表示正常,可以使用。然后把仿真器的另外一端连接到开发板,给开发板上电,然后就可以通过软件KEIL或者IAR给开发板下载程序。

仿真器与电脑和开发板连接方式


我买的是高速模块,集成了,2根线连接的另一端都是usb接口,等于一个数据线,一个供电线。

## 仿真器配置
在仿真器连接好电脑和开发板且开发板供电正常的情况下,打开编译软件KEIL,在魔术棒选项卡里面选择仿真器的型号。
新建一个demo项目。



点击OK。
## Debug选项配置
设置之前,需要连接好线路,并开机开发版。

Debug选择CMSIS-DAP Debugger


Utilities选项配置,Utilities选择 Use Debug Driver

Debug Settings 选项配置

选择目标板
选择目标板,具体选择多大的FLASH要根据板子上的芯片型号决定。
野火STM32开发板的配置是:F1选512K,F4选1M。
这里面有个小技巧就是把Reset and Run也勾选上,这样程序下载完之后就会自动运行,否则需要手动复位。
擦除的FLASH大小选择Sectors即可,不要选择Full Chip,不然下载会比较慢。
这里我的识别如下:
10MHz 通信也能选择,那就用 10MHz——原则就是“稳定的前提下尽量高”,下载大固件能省一半时间。以后哪天下载开始偶发失败,第一反应降速就好。

## 选择目标板
选择目标板,具体选择多大的FLASH要根据板子上的芯片型号决定。野火STM32开发板的配置是:F1选512K,F4选1M。这里面有个小技巧就是把Reset and Run也勾选上,这样程序下载完之后就会自动运行,否则需要手动复位。擦除的FLASH大小选择Sectors即可,不要选择Full Chip,不然下载会比较慢。

这里我的是:

点击OK即可。
## 下载程序
如果前面步骤都成功了,接下来就可以把编译好的程序下载到开发板上运行。下载程序不需要其他额外的软件,直接点击KEIL中的LOAD按钮即可。
程序下载后,Build Output选项卡如果打印出 Application running…则表示程序下载成功。如果没有出现实验现象,按复位键试试。
## 测试是否可以开发
工程树里 Source Group 1 下面是空的:没有启动文件、没有 main.c。这状态直接写代码编译会报错(找不到入口)。所以分两步:先补启动文件,再贴代码。

### 第 1 步:补启动文件
启动文件是汇编写的,负责建中断向量表、初始化堆栈、配好时钟再跳进你的 main——没有它工程链接不起来。DFP 里自带,不用手动拷:
菜单 Project → Manage → Run-Time Environment
在 Device 分组里勾上 Startup
如果勾完出现黄色/红色警告,点右下角 Resolve(会自动补上 CMSIS:CORE 依赖)
OK。工程树里会多出一个 Startup 组(startup_stm32f10x_xx.s + system_stm32f10x.c,具体哪个 .s 按你选的器件自动挑,不用管)


### 第 2 步:新建 main.c 并粘贴
右键 Source Group 1 → Add New Item to Group 'Source Group 1' → 选 C File (.c),名字填 main,粘贴:


```c
#include "stm32f10x.h"
/* ====== 按板子改这里 ====== */
/* 默认按野火指南者写:红=PB5 绿=PB0 蓝=PB1,共阳极(低电平点亮) */
#define R_PIN 5u
#define G_PIN 0u
#define B_PIN 1u
#define LED_ON 0u /* 灯全反了就把 0/1 互换 */
#define LED_OFF 1u
static void delay(volatile uint32_t n) /* 空转延时,volatile 防止被优化掉 */
{
while (n--) { __NOP(); }
}
static void pin_out_init(uint8_t pin) /* 配成推挽输出 50MHz */
{ /* F1 规则:CRL 管脚0~7,CRH 管脚8~15,每脚 4 位 */
if (pin < 8)
GPIOB->CRL = (GPIOB->CRL & ~(0xFu << (4u * pin))) | (0x3u << (4u * pin));
else
GPIOB->CRH = (GPIOB->CRH & ~(0xFu << (4u * (pin - 8u)))) | (0x3u << (4u * (pin - 8u)));
}
static void rgb_write(uint8_t r, uint8_t g, uint8_t b) /* 各通道 1=亮 */
{
uint32_t odr = GPIOB->ODR;
odr = (odr & ~(1u << R_PIN)) | ((r ? LED_ON : LED_OFF) << R_PIN);
odr = (odr & ~(1u << G_PIN)) | ((g ? LED_ON : LED_OFF) << G_PIN);
odr = (odr & ~(1u << B_PIN)) | ((b ? LED_ON : LED_OFF) << B_PIN);
GPIOB->ODR = odr;
}
int main(void)
{
/* 7 色:红 绿 蓝 黄 品红 青 白 */
static const uint8_t colors[7][3] = {
{1,0,0}, {0,1,0}, {0,0,1},
{1,1,0}, {1,0,1}, {0,1,1}, {1,1,1},
};
uint8_t i;
RCC->APB2ENR |= (1u << 3); /* 开 GPIOB 时钟(APB2ENR 的 bit3=IOPBEN),不开时钟寄存器写了也白写 */
pin_out_init(R_PIN);
pin_out_init(G_PIN);
pin_out_init(B_PIN);
while (1) {
for (i = 0; i < 7; i++) {
rgb_write(colors[i][0], colors[i][1], colors[i][2]);
delay(0x300000u); /* 每色停留时长,越大越慢,先跑起来再调 */
}
}
}
```
第 3 步:编译下载
F7 编译(期望 0 Error)→ 点 LOAD(F8)下载 → Build Output 出现 Application running...,板子上 RGB 灯应该开始 7 色轮播。没现象按一下复位键。
这里按F7我的代码报错。
```
Build started: Project: demo
*** Using Compiler 'V6.24', folder: 'D:\developSoft\Keil_v5\ARM\ARMCLANG\Bin'
Build target 'Target_1'
Validate Run Time Environment: errors/warnings detected:
'Keil::Device:Startup@1.0.0': warning #515: Additional software components required
require CMSIS:CORE: Select component from list
'ARM::CMSIS:CORE'
RTE/Device/STM32F103VE/system_stm32f10x.c(64): warning: In file included from...
D:/developSoft/Keil_v5/ARM/PACK/Keil/STM32F1xx_DFP/2.4.1/Device/Include\stm32f10x.h(486): error: 'core_cm3.h' file not found
486 | #include "core_cm3.h"
| ^~~~~~~~~~~~
1 error generated.
compiling system_stm32f10x.c...
main.c(1): warning: In file included from...
D:/developSoft/Keil_v5/ARM/PACK/Keil/STM32F1xx_DFP/2.4.1/Device/Include\stm32f10x.h(486): error: 'core_cm3.h' file not found
486 | #include "core_cm3.h"
| ^~~~~~~~~~~~
1 error generated.
compiling main.c...
assembling startup_stm32f10x_hd.s...
".\Objects\demo.axf" - 2 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed: 00:00:00
```
原因是我勾选了startup组件,Device:Startup,但它还依赖 CMSIS:CORE 组件没勾上。
菜单 Project → Manage → Run-Time Environment
你会看到 Keil::Device:Startup 那行带着黄色警告。点右下角的 Resolve 按钮——它自动把缺的 ARM::CMSIS:CORE 勾上(也可以自己在列表 CMSIS 分组里手动勾 CORE,效果一样)
OK 关掉,警告消失
F7 重新编译

点击后直接绿色,然后F7编译。

非常顺利,然后然后 F8 下载,看七彩轮播。

## 擦除
现在插电就七彩灯,有点烦,反正烧录代码都在项目工程里面。
直接擦除,免得烦人。

然后按一下开发版上面的复位键即可。


