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给开发板下载程序。 ![图片1](https://blogs.evocosmos.com/upload/blogs_20261025002-image1.png) 仿真器与电脑和开发板连接方式 ![图片2](https://blogs.evocosmos.com/upload/blogs_20261025002-image2.png) ![图片3](https://blogs.evocosmos.com/upload/blogs_20261025002-image3.png) 我买的是高速模块,集成了,2根线连接的另一端都是usb接口,等于一个数据线,一个供电线。 ![图片4](https://blogs.evocosmos.com/upload/blogs_20261025002-image4.jpg) ## 仿真器配置 在仿真器连接好电脑和开发板且开发板供电正常的情况下,打开编译软件KEIL,在魔术棒选项卡里面选择仿真器的型号。 新建一个demo项目。 ![图片5](https://blogs.evocosmos.com/upload/blogs_20261025002-image5.png) ![图片6](https://blogs.evocosmos.com/upload/blogs_20261025002-image6.png) ![图片7](https://blogs.evocosmos.com/upload/blogs_20261025002-image7.png) 点击OK。 ## Debug选项配置 设置之前,需要连接好线路,并开机开发版。 ![图片13](https://blogs.evocosmos.com/upload/blogs_20261025002-image13.png) Debug选择CMSIS-DAP Debugger ![图片8](https://blogs.evocosmos.com/upload/blogs_20261025002-image8.png) ![图片9](https://blogs.evocosmos.com/upload/blogs_20261025002-image9.png) Utilities选项配置,Utilities选择 Use Debug Driver ![图片10](https://blogs.evocosmos.com/upload/blogs_20261025002-image10.png) Debug Settings 选项配置 ![图片11](https://blogs.evocosmos.com/upload/blogs_20261025002-image11.png) 选择目标板 选择目标板,具体选择多大的FLASH要根据板子上的芯片型号决定。 野火STM32开发板的配置是:F1选512K,F4选1M。 这里面有个小技巧就是把Reset and Run也勾选上,这样程序下载完之后就会自动运行,否则需要手动复位。 擦除的FLASH大小选择Sectors即可,不要选择Full Chip,不然下载会比较慢。 这里我的识别如下: 10MHz 通信也能选择,那就用 10MHz——原则就是“稳定的前提下尽量高”,下载大固件能省一半时间。以后哪天下载开始偶发失败,第一反应降速就好。 ![图片15](https://blogs.evocosmos.com/upload/blogs_20261025002-image15.png) ## 选择目标板 选择目标板,具体选择多大的FLASH要根据板子上的芯片型号决定。野火STM32开发板的配置是:F1选512K,F4选1M。这里面有个小技巧就是把Reset and Run也勾选上,这样程序下载完之后就会自动运行,否则需要手动复位。擦除的FLASH大小选择Sectors即可,不要选择Full Chip,不然下载会比较慢。 ![图片16](https://blogs.evocosmos.com/upload/blogs_20261025002-image16.png) 这里我的是: ![图片17](https://blogs.evocosmos.com/upload/blogs_20261025002-image17.png) 点击OK即可。 ## 下载程序 如果前面步骤都成功了,接下来就可以把编译好的程序下载到开发板上运行。下载程序不需要其他额外的软件,直接点击KEIL中的LOAD按钮即可。 程序下载后,Build Output选项卡如果打印出 Application running…则表示程序下载成功。如果没有出现实验现象,按复位键试试。 ## 测试是否可以开发 工程树里 Source Group 1 下面是空的:没有启动文件、没有 main.c。这状态直接写代码编译会报错(找不到入口)。所以分两步:先补启动文件,再贴代码。 ![图片19](https://blogs.evocosmos.com/upload/blogs_20261025002-image19.png) ### 第 1 步:补启动文件 启动文件是汇编写的,负责建中断向量表、初始化堆栈、配好时钟再跳进你的 main——没有它工程链接不起来。DFP 里自带,不用手动拷: 菜单 Project → Manage → Run-Time Environment 在 Device 分组里勾上 Startup 如果勾完出现黄色/红色警告,点右下角 Resolve(会自动补上 CMSIS:CORE 依赖) OK。工程树里会多出一个 Startup 组(startup_stm32f10x_xx.s + system_stm32f10x.c,具体哪个 .s 按你选的器件自动挑,不用管) ![图片18](https://blogs.evocosmos.com/upload/blogs_20261025002-image18.png) ![图片20](https://blogs.evocosmos.com/upload/blogs_20261025002-image20.png) ### 第 2 步:新建 main.c 并粘贴 右键 Source Group 1 → Add New Item to Group 'Source Group 1' → 选 C File (.c),名字填 main,粘贴: ![图片21](https://blogs.evocosmos.com/upload/blogs_20261025002-image21.png) ![图片22](https://blogs.evocosmos.com/upload/blogs_20261025002-image22.png) ```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 重新编译 ![图片23](https://blogs.evocosmos.com/upload/blogs_20261025002-image23.png) 点击后直接绿色,然后F7编译。 ![图片24](https://blogs.evocosmos.com/upload/blogs_20261025002-image24.png) 非常顺利,然后然后 F8 下载,看七彩轮播。 ![图片25](https://blogs.evocosmos.com/upload/blogs_20261025002-image25.png) ## 擦除 现在插电就七彩灯,有点烦,反正烧录代码都在项目工程里面。 直接擦除,免得烦人。 ![图片26](https://blogs.evocosmos.com/upload/blogs_20261025002-image26.png) 然后按一下开发版上面的复位键即可。 ![图片27](https://blogs.evocosmos.com/upload/blogs_20261025002-image27.png)

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论