资讯详情

资讯详情

Keil5新建STM32F103VCT6工程:芯片包、启动文件与烧录配置详解

简介面向嵌入式开发者的Keil5软件工程模板基于STM32F103VCT6芯片适合刚接触STM32或希望规范项目结构的开发者。资源以标准分层方式组织代码将应用逻辑与硬件驱动分离方便后续维护与扩展。压缩包共57个文件包含28个头文件、27个C源文件、1个Keil工程文件.uvprojx及1个启动文件.s整体大小254KB结构紧凑。其中Bsp目录封装时钟、GPIO等底层驱动App目录聚焦业务代码Libraries目录集成标准外设库Project目录保存编译配置Doc目录预留文档位便于团队协作与项目交接。目前已有906人学习可用于快速搭建开发环境、理解工程创建流程及规范目录管理。该模板尤其适合课程设计、毕业设计及企业项目初期搭建过程中作为基础框架套用。1. 用 Keil5 给 STM32F103VCT6 新建软件工程最怕的不是编译报错Keil5 新建 STM32 软件工程最怕的不是编译报错而是项目建完Keil5 的器件选择器里没有 STM32F103VCT6或者启动文件放错密度导致程序在 GPIO 点灯阶段就卡死在 HardFault_Handler。这个型号看起来和最常见的 STM32F103C8T6 很像但 VCT6 是 100 脚封装的 256KB Flash 高密度芯片引脚多、外设多软件工程的目录和配置按 C8T6 的模板改反而容易埋雷。我一般会把芯片包、启动文件、编译宏和下载算法四件事一起确认再往工程里加代码。下面按“安装确认 - 建工程 - 配置基础组件 - 烧录验证 - 固化成模板”的顺序走一遍最后会留一个能反复复用的 Keil5 工程基线。2. 在 Keil5 建立的第一个 STM32F103VCT6 工程先解决芯片包和目录问题新建 STM32F103VCT6 的软件工程不能用老的 Keil4 思路直接套。Keil5 采用软件包并行管理的方式软件包没装新建工程向导里就搜不到这个具体型号。很多人照网上的 keil5 安装教程装完发现器件列表里只有 STM32F0这就是因为 STM32F1 的支持包没装。下面先查芯片包再建工程最后把目录规范成软件工程结构。2.1 Keil5 的芯片包没装时器件选择器没有任何 STM32F103VCT6打开 Keil5 后从菜单栏的 Project - Manage - Pack Installer 进入软件包管理界面。在搜索框输入“STM32F1”找到 STMicroelectronics 名下的 STM32F1 Series Device Support 包看 Installed 列是否有版本号。没有版本号的话在线点击 Install或先下载 .pack 文件后双击离线安装。安装包体积不小安装位置最好和 Keil5 默认目录一致否则后续“找不到 Device”的顽固问题会回来。现象可能原因处理方式器件选择器搜不到 STM32F103VCT6STM32F1 支持包未安装Pack Installer 安装 STM32F1 Series Device Support能搜到型号但编译报缺 core_cm3.h支持包版本过旧或包损坏在 Pack Installer 里 Update或重装 .pack同一个 Keil 里 51 和 32 都能用Keil5 兼容 C51 和 STM32 安装缺哪一个包该型号就搜不到分别安装 C51 的 Device Pack 和 ARM 的 Device Pack这里要特别说一句Keil5 兼容 C51 和 STM32 安装并非一个软件包通吃而是两套编译器通过不同 pack 共存。装了 C51 包只能写 51 单片机装了 ARM 相关包才能用 Keil5 建 STM32 软件工程。如果你之前只装了 51会出现能打开界面但新建不了 STM32 工程的现象。2.2 新建工程时从器件选择器找到 LQFP100 的 VCT6确认芯片包正常后执行 Project - New uVision Project输入工程名例如vct6_demo。工程文件会生成一个.uvprojx这是 Keil5 的项目文件。紧接着弹出的 Device 选择页里搜索STM32F103VCT6在结果列表里点击条目右侧会出现器件的封装、Flash 和 RAM 信息。注意核对封装是 LQFP100而 VCT6 与 VBT6、VET6 的差异主要在 Flash 容量选错后后续所有存储配置都会跟着错。选择完成后点 OK会看到 Manage Run-Time Environment 窗口。第一次使用时很多人会在这个页面勾选 CMSIS、Device 组件实际上即便不勾选也能继续。工程创建初期先保持默认点 OK 回到主界面。此时左侧的 Project 栏可能只有空白的 Target 和一个目标分组看不到任何目录这属于正常现象。关于 Keil5 左侧目录怎么显示后面加完文件就会清楚。2.3 把软件工程拆成四个目录避免 STM32F103VCT6 工程日后膨胀新建工程后第一件事不是写 main.c而是把目标芯片、启动文件、外设驱动、用户应用分开。我一般会在工程目录下维护下面几个文件夹mkdir -p STM32F103VCT6_App/Drivers STM32F103VCT6_App/Startup STM32F103VCT6_App/User STM32F103VCT6_App/Document对应关系如下。目录放什么作用Driversstm32f10x_gpio.c、stm32f10x_rcc.c 等外设库源文件不把库和业务代码混在一起Startupstartup_stm32f10x_hd.s、system_stm32f10x.c复位向量和系统时钟初始化Usermain.c、stm32f10x_it.c、自定义头文件应用入口和中断处理Document引脚分配表、修改记录软件工程的可追踪信息这些都是 Keil5 建 F103 工程时很容易忽略的工程分层。标准库例程通常把所有.c塞进一个 Source 文件夹你自己的软件工程完全可以把它们分得更细尤其是以后加日志调试时目录分清了Include 路径才容易配置。以后程序变大可以再把 BSP 目录、Middware 目录加进来现在先把这个最小骨架立住。3. 启动文件、微库和编译宏STM32F103VCT6 的 Keil5 工程基础组件很多 STM32F103VCT6 例程是从 C8T6 工程改过来的最突出的问题就是启动文件用错。网上搜到的大多数 stm32f103vct6 例程作者会提醒把 startup_stm32f10x_md.s 改成 startup_stm32f10x_hd.s但改完只是第一步。这一章把启动文件、外设库和编译宏一次性讲清。3.1 高密度启动文件和向量表的关系STM32F103 根据 Flash 容量分成低密度、中密度、高密度、超高密度。VCT6 的 256KB Flash 落在高密度范围因此 Keil5 工程里必须使用startup_stm32f10x_hd.s。启动文件里的向量表定义了复位后从哪里取栈顶、异常和中断入口在哪容量判断错了不会立刻报错而是在用到某个外设中断或不正确初始化时钟后进入 HardFault。器件密度典型型号Flash 范围启动文件低密度 LDSTM32F103C4T616KB/32KBstartup_stm32f10x_ld.s中密度 MDSTM32F103C8T6、RBT664KB/128KBstartup_stm32f10x_md.s高密度 HDSTM32F103VCT6、ZET6256KB/512KBstartup_stm32f10x_hd.s超高密度 XLSTM32F103ZGT6 等512KB 以上startup_stm32f10x_xl.s如果你使用 Keil5 的 Run-Time Environment勾选Device - Startup后Keil 会根据当前器件自动选择启动文件不需要手工改文件名。但很多项目仍以标准外设库为主会从库里拷贝 startup 系列文件到 Startup 目录此时要手动删除 md 版本并添加 hd 版本。添加时在左侧源文件分组上右键 Add Existing Files文件类型选 All Files 才能看到.s文件。3.2 用 RTE 还是标准外设库取决于你维护的是哪类软件工程选择完启动文件后需要确定外设驱动来源。STM32F103 有三个常见路线寄存器直接操作只依赖 CMSIS 头文件标准外设库SPL也就是 stm32f10x_gpio.c、stm32f10x_rcc.c 这批文件STM32Cube HAL由 CubeMX 生成初始化代码配合 Keil5 使用。新建 Keil5 工程时如果目标是快速验证 STM32F103VCT6 的硬件我一般会用寄存器或标准外设库。寄存器代码直接、可控适合点灯和底层验证标准外设库可读性好适合搬到有团队协作的软件工程里去。HAL 库更适合从 CubeMX 启动的新项目但这篇文章的核心是 Keil5 建工程的过程所以下面以标准外设库作为例子。在 Manage Run-Time Environment 里如果需要在 Keil5 下加入标准外设库常见做法是把库源文件手动添加到工程而不是通过 RTE 勾选。把stm32f10x_gpio.c、stm32f10x_rcc.c、stm32f10x_flash.c添加到一个外设分组并把库头文件的路径加入 C/C 的 Include Paths。注意不要把库里的每一个.c都加进去那样 Keil5 编译很慢而且可能触发从未启用外设的错误。我常驻的外设文件只有stm32f10x_rcc.c、stm32f10x_gpio.c、stm32f10x_usart.c和core_cm3.c用不到的先不加。对外设库没有特殊要求时这个取舍能明显缩短编译时间。3.3 Define 里写 STM32F10X_HD这个宏不是随便写的使用标准外设库时头文件stm32f10x.h会根据两个宏决定具体包含哪些外设定义和中断号。它们在 Keil5 的 Options for Target - C/C - Define 里配置USE_STDPERIPH_DRIVER, STM32F10X_HDUSE_STDPERIPH_DRIVER告诉库用户使用外设驱动层STM32F10X_HD则选择高密度器件的寄存器偏移和中断向量。忘了定义 STM32F10X_HD编译时会直接报#error Please select the target STM32F10x device。如果你停留在 STM32F10X_MD那么 GPIO 的 AFIO 重映射、USART1 到 4 的映射都会不一样问题很隐蔽。这里还要顺带提一个有关 Keil5 使用教程里经常混淆的概念printf打印到串口时很多教程会建议勾选 MicroLIB。MicroLIB 让fputc的实现更简洁但它裁剪了部分 C 标准库功能。对 STM32F103VCT6 这种 48KB SRAM 的器件MicroLIB 通常在软件工程调试阶段够用如果后续用到文件系统或复杂浮点格式再把 MicroLIB 取消换用完整库避免软堆栈不足。参数改完记得重启一次编译否则 C/C 宏变更有时不能被增量编译立即捕获。4. 写入最小点灯代码并设置 Flash 下载参数Keil5 烧录 STM32F103VCT6理论骨架有了接下来写一段能在 STM32F103VCT6 上跑起来的点灯代码然后配置下载器顺便把烧录失败和 HardFault 的常见原因列出来。4.1 最小点灯代码用 GPIOC 的第 13 脚验证工程环境新建一个main.c先写入如下代码#include stm32f10x.h static void delay(void) { volatile uint32_t i; for (i 0; i 1000000; i); } int main(void) { RCC-APB2ENR | RCC_APB2ENR_IOPCEN; // 使能 GPIOC 时钟 GPIOC-CRH ~(0x0F 20); // 清空 PC13 的配置位 GPIOC-CRH | (0x01 20); // PC13 推挽输出最大速度 50MHz while (1) { GPIOC-BRR (1 13); // PC13 输出低电平 delay(); GPIOC-BSRR (1 13); // PC13 输出高电平 delay(); } }逻辑说明第一行打开 APB2 总线上的 GPIOC 时钟不打开时钟后续写寄存器不会报错但也不会生效CRH是 GPIO 高 8 位引脚的控制寄存器PC13 属于高字节范围所以先清位再设置模式为通用推挽输出。BRR 和 BSRR 都是原子操作避免读-改-写过程的中间状态。延时用空循环先不依赖系统滴答。把main.c保存后在 Keil5 左侧工程窗口的 Source Group 1 上右键选择 Add Existing Files找到刚才创建的main.c把它加进去。此时左侧目录窗口会显示main.c和启动文件。如果左侧目录不显示点击 View - Project Window 或双击工作区左侧的 Project 页签即可。这就是很多新手问的 Keil5 左侧目录怎么显示的问题。4.2 配置 ST-Link 和 512KB 烧录算法点魔术棒进入 Options for Target在 Debug 选项卡选择调试器。我一般选 ST-Link Debugger点旁边的 Settings在 Debug 页确认 Port 为 SW最大速度先填 1MHz。这里不能用 ST-Link 的 JTAG 和 UART 口混用实际使用时尽量使用 SWD连接线只需要 SWDIO、SWCLK、GND 三根。切换到 Flash Download 页去掉原来默认的错误算法点击 Add在列表里选择STM32F10x 512kB Flash起始地址填0x08000000。把编程方式选为 Erase Full Chip勾选 Reset and Run这样下载完就直接跑。具体参数见下表。参数推荐值说明PortSW占用引脚少兼容性好Max Clock1MHz5MHz先低速降接触不良概率Programming AlgorithmSTM32F10x 512kB Flash适配高密度器件Flash模块RAM for Algorithm起始 0x20000000大小 0x4000给烧录程序用的运行空间Reset and Run勾选跳过手动复位步骤这里容易犯的错是保留默认的STM32F10x 128kB Flash算法。在 VCT6 上这个算法名称带 128k实际并不是按芯片真实容量判断但地址范围不够时擦除整个 256KB 会有问题下载会报错误表现为 Keil5 烧录失败。最稳妥的是直接采用 512KB Flash 算法擦除全片后再写。4.3 烧录失败和 HardFault 的排查顺序按现象分类Keil5 烧写 STM32F103VCT6 时最常见的问题是能编译但无法下载。这时先看下载算法文件是否添加正确再看复位引脚上的电容有没有把复位拉死。如果调试器下方的 Connect 设置为 under Reset又碰巧把 NRST 占用也会导致连接失败。这里按现象给一个快速分类表。现象原因处理Flash Download failed进度条停在 erase烧录算法选错/速度太快换 512kB 算法降 SW Clock 到 1MHz勾 Erase Full ChipCannot access target报 SWD 错误芯片供电异常、SWDIO/SWCLK 接反量 VDD调换两条线按住复位再点下载烧录后无反应复位也不跑电源脚问题、启动模式 BOOT0 没有拉低确保 BOOT0 接 GND顺着复位按钮检查 RST起内存分配或栈溢出进入 HardFault_Handler启动文件用 md、栈设太小、系统时钟没起换 hd 启动文件上调 Stack_Size用标准库时钟配置keil5 编译很慢加入全部外设源文件工程包含大量无关文件只添加用到的.c关闭 Browse Info必要时勾选 One ELF Section per FunctionHardFault 最容易被忽略的一个原因是system_stm32f10x.c的时钟配置里默认使用了外部 8MHz 晶振而你的板子上没有 8MHz 晶振或者 HSE 启动超时。对于已经开始调试的工程可以先把系统时钟切到内部 HSI确认硬件问题排除后再回到外部晶振。STM32F103VCT6 引脚多硬件上可能有多个晶振和复位开关拿到板子后先对照 stm32f103vct6 引脚图确认启动引脚、LED 网络和调试口再去查软件问题往往更快。5. 固定工程模板用分散加载文件和 fromelf 命令验证 STM32F103VCT6 工程新建工程流程跑通之后把整个目录做成模板比每次重新点新建省时间得多。最后这一步给出两个实用设置一个是校核 Target 里的 Flash 和 RAM 地址另一个是让 Keil5 在编译完成后自动生成 bin。5.1 校验 Target 选项里的存储空间VCT6 不是 VET6在 Options for Target - Target 里Keil5 默认使用自动生成的分散加载文件。正确的 ROM 范围应为0x08000000起始大小0x00040000RAM 范围为0x20000000起始大小0x0000C000。这两个数字来自芯片的 256KB Flash 和 48KB SRAM。若从 ZET6 或 VET6 模板拷过来大小会变成0x00080000和0x00010000超出部分访问时会产生总线故障。平时点灯感觉不到一旦用到超过 48KB 的数组就会踩雷。如果工程里使用外部 SRAM 或片外内存可以改 Use Memory Layout from Target Dialog 为手工分散加载文件但 STM32F103VCT6 最简单可靠的做法是让 Keil 自动生成.sct只改 Target 参数。不要直接编辑 sct 里的地址段除非你要把关键代码放到固定扇区。5.2 编译后自动输出 bin 文件并观察 Program Size在 Options for Target - User - After Build/Rebuild 里新增一条命令fromelf.exe --bin --output .\Objects\vct6.bin .\Objects\vct6.axffromelf.exe位于 Keil5 的 ARM 编译器目录里如果命令找不到就把它替换成你本机 Keil 安装目录下的完整路径。--bin表示输出二进制文件--output指定写入路径最后一个参数是链接器生成的.axf文件。这条命令把.axf转成.bin烧录工具和量产工具都更偏好 bin 格式。执行完命令后返回 Build Output 窗口查看Program Size: Codexxx ROxxx RWxxx ZIxxx其中 ZI 大小对应运行时 RAM 需求CodeROData 不能超过 256KBRWZI 不能超过 48KB。超过时程序在板子上表现多为启动后立刻 HardFault或下载正常但复位后白屏。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →