Keil5创建新工程完整示例:从安装到运行

手把手教你从零开始用Keil5点亮第一颗LED:不只是“新建工程”那么简单

你是不是也曾在搜索引擎里输入“keil5怎么创建新工程”,点开十几篇教程,跟着一步步操作,结果最后编译报错、下载失败、板子毫无反应?
别急——这不是你的问题。真正的问题在于:大多数教程只告诉你“怎么做”,却从不解释“为什么”。

今天,我们就来打破这个魔咒。这篇文章不走捷径,也不堆术语,而是带你从安装Keil的那一刻起,完整经历一个真实嵌入式项目的诞生过程——直到你亲手写的代码让那颗小小的LED开始闪烁。

整个过程我们会聚焦在STM32F103C8T6(俗称“蓝丸”)这款经典芯片上,它是初学者最常用的MCU之一,资料丰富、成本低廉。更重要的是,通过它,你能理解几乎所有ARM Cortex-M系列开发的核心逻辑。


一、Keil MDK 到底是什么?别再把它当成“写代码的软件”了

很多人以为 Keil 就是个编辑器,像记事本一样用来打字。错了。

Keil MDK(Microcontroller Development Kit)是一个完整的工具链生态系统,由几个关键部分协同工作:

  • µVision IDE:图形界面,负责项目管理、调试控制。
  • ARM Compiler 5/6:真正的“翻译官”,把C语言变成MCU能执行的机器码。
  • Device Family Pack (DFP):芯片支持包,包含寄存器定义、启动文件和Flash算法。
  • Debugger Driver:连接J-Link、ST-Link等硬件调试器的桥梁。

📌 简单说:没有DFP,Keil就不认识STM32;没有Compiler,写再多代码也没用;没有Debugger,程序烧不进芯片。

所以当你问“Keil5怎么创建新工程”时,其实是在问:“如何让这套系统为某一款特定MCU准备好所有资源,并生成可运行的程序?”


二、第一步不是打开Keil,而是确认三件事

在你双击uv4.exe之前,请先检查以下三点:

✅ 1. 安装路径不能有中文或空格

比如:

❌ C:\Program Files (x86)\Keil_v5\ ✅ C:\Keil_v5\

否则可能出现编译器调用失败、路径解析错误等问题。

✅ 2. 以管理员身份安装并运行一次

某些驱动(尤其是ULINK)需要注册表权限。如果你发现ST-Link识别不了,很可能就是权限问题。

✅ 3. 安装 STM32F1 系列支持包(Pack Installer)

打开 Keil →Pack Installer(右上角图标)→ 搜索STM32F1 Series→ 安装最新版本的Keil.STM32F1xx_DFP

⚠️ 注意:这一步非常关键!如果不装这个包,即使你选了STM32F103C8,Keil也不会自动给你提供正确的启动文件和Flash算法。


三、真正的新建工程:每一步都在和硬件对话

现在我们正式开始创建工程。记住:每一个选项背后都是对硬件的实际配置

第一步:Project → New uVision Project

选择保存路径,例如:

D:\Projects\Blink_LED\Blink_LED.uvprojx

💡 建议:工程名不要用中文,目录层级不要太深。

第二步:选择目标芯片

弹出的 “Select Device for Target” 窗口中,搜索STM32F103C8

📌 必须精确匹配!虽然STM32F103C8和CB封装相似,但Flash大小不同(64KB vs 128KB),链接脚本也不同。

选中后点击 OK。

此时 Keil 会做几件事:
- 自动加载该芯片的头文件(如stm32f10x.h
- 注册中断向量表
- 准备默认的分散加载脚本(scatter file)

但还差一个重要东西——启动文件

第三步:添加启动文件(Startup File)

Keil 通常会弹窗提示:

“Copy startup code to project folder and add to project? (Yes/No)”

点击Yes

你会发现项目树中多了一个文件:

startup_stm32f103xb.s

🔍 为什么是 xb?因为C8属于Medium-density(中等密度),对应xB系列。如果你用了HD高密度芯片,就得用xc或xd版本。

这个.s文件是汇编写的,作用至关重要:

Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main LDR R0, =__initial_sp ; 设置栈顶指针 MSP LDR R1, =Reset_Handler MSR MSP, R0 ; 写入主堆栈 CPSIE I ; 开中断? LDR R0, =SystemInit BLX R0 ; 跳转到 SystemInit() LDR R0, =__main BX R0 ; 跳转到 C 运行时环境 ENDP

看不懂没关系,你只需要知道它的任务是:
1. 初始化堆栈指针(MSP)
2. 清零.bss段(未初始化全局变量置0)
3. 复制.data段(已初始化变量从Flash搬到SRAM)
4. 调用SystemInit()→ 最终进入main()

如果少了它,程序根本不会运行,哪怕 main 函数写得再完美。


四、链接脚本(Scatter File)决定程序住哪儿

接下来我们要看一个常被忽略但极其重要的文件:分散加载描述文件(scatter loading file)

它决定了代码各段放在Flash哪里,数据放SRAM哪个区域。

默认情况下,Keil 使用内置 scatter file,但我们最好手动指定一个,避免出错。

如何查看和修改?

进入菜单:Options for TargetLinker标签页 → 取消勾选“Use Memory Layout from Target Dialog” → 勾选“Use Scatter File”,然后浏览添加自定义.sct文件。

对于 STM32F103C8T6(64KB Flash + 20KB SRAM),典型的.sct内容如下:

LR_IROM1 0x08000000 0x00010000 { ; Load Region: Flash 64KB ER_IROM1 0x08000000 0x00010000 { ; Executable Region *.o (RESET, +First) ; 向量表必须在最前面 *(InRoot$$Sections) .ANY (+RO) ; 其他只读代码 } RW_IRAM1 0x20000000 0x00005000 { ; Read-Write Region: SRAM 20KB .ANY (+RW +ZI) ; 可读写 + 零初始化段 } }

🧩 解释一下:
-0x08000000是Flash起始地址
-0x20000000是SRAM起始地址
-+First表示中断向量表必须位于首地址
-.ANY (+RO)包括.text,.const等代码段

如果你改了这个文件,记得全编译一次(Project → Rebuild all target files),否则旧缓存可能让你怀疑人生。


五、终于可以写代码了:直接操作寄存器点亮LED

我们现在来写最简化的 main.c,不依赖任何库函数,纯粹操作寄存器。

场景设定:

  • LED 接在 PC13 引脚,共阳极接法(即拉低点亮)
  • 使用内部高速时钟 HSI(8MHz),不需要外部晶振也能跑
// main.c #include "stm32f10x.h" void Delay(volatile uint32_t count) { while (count--) { __NOP(); // 插入空操作,防止编译器优化掉循环 } } int main(void) { // === 第一步:使能GPIOC时钟 === RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // === 第二步:配置PC13为通用推挽输出模式 === // CRH 控制端口高位(PIN8~15) GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13); GPIOC->CRH |= GPIO_CRH_MODE13_1; // 输出模式,最大速度2MHz // CNF13=00 已由上面清零,表示推挽输出 // === 第三步:初始状态设为高电平(熄灭LED)=== GPIOC->BSRR = GPIO_BSRR_BS13; // === 主循环:拉低→延时→拉高→延时 === while (1) { GPIOC->BSRR = GPIO_BSRR_BR13; // BR13 = Bit Reset, 拉低 Delay(0xFFFFF); GPIOC->BSRR = GPIO_BSRR_BS13; // BS13 = Bit Set, 拉高 Delay(0xFFFFF); } }

✅ 关键点解析:
-RCC->APB2ENR:必须先开启时钟,否则GPIOC无法响应;
-CRH寄存器控制 PIN8~15,每个PIN占4位(MODE+CNR);
-BSRR支持原子操作,无需读改写,安全高效;
-Delay()是粗略延时,实际项目应使用 SysTick 或定时器。

将此文件加入工程中的Source Group 1


六、关键设置不能漏:Output、Debug、Utilities

进入Options for Target(Alt+F7),完成以下配置:

1. Output 标签页

  • ✔️ Create HEX File:生成可用于烧录的HEX文件
  • ✔️ Select Folder for Objects:建议单独设置输出目录,如.\Output\

📁 用途:方便提取固件给生产部门或用于OTA升级。

2. Debug 标签页

  • 选择调试器类型:ST-Link Debugger 或 J-Link
  • 点击 Settings → Connection → 选择 SWD 接口(比JTAG引脚少)

🔍 如果提示“No ST-Link Found”,请检查:
- ST-Link是否正常供电?
- 是否被其他软件占用(如STM32CubeProgrammer)?
- 驱动是否安装成功?(设备管理器中是否有ST-LINK)

3. Utilities 标签页

  • ✔️ Use Target Driver for Flash Programming
  • 点击 Settings → Flash Download → Add → 选择对应设备算法,如:
    STM32F10x 64KB Flash

⚠️ 这一步至关重要!如果没有加载正确的Flash算法,会出现“Flash Timeout”、“Programming Algorithm Failed”等错误。


七、构建与下载:见证奇迹的时刻

一切就绪,按下F7编译。

如果出现:
- ❌ “Target not created” → 检查是否有 main 函数?是否添加了启动文件?
- ❌ “Undefined symbol” → 头文件路径是否正确?Include Paths 是否加了...\CMSIS
- ❌ “Access Error” → 是否选择了错误的Flash算法?芯片是否处于BOOT模式?

当看到:

"0 Error(s), 0 Warning(s)"

恭喜你,已经成功一半!

点击工具栏上的Download按钮(向下箭头图标),程序将被写入MCU的Flash。

然后点击Run(绿色三角)或按复位键,观察PC13上的LED是否开始闪烁!


八、常见坑点与调试秘籍

🔹 问题1:程序下载成功,但LED不亮

排查思路:
1. 用万用表测 PC13 对地电压,应该在 0V ↔ 3.3V 之间跳变;
2. 查看原理图,确认LED是共阳还是共阴;
3. 检查是否误将PB1、PA1等其他引脚当作PC13;
4. 添加调试断点,在while循环处暂停,查看寄存器值。

🔹 问题2:每次都要手动点Download,能不能自动?

当然可以!进入Debug标签页 → 下方有个选项:

✔️ Load Application at Startup
✔️ Run to main()

这样每次进入调试模式,都会自动下载并跳转到main函数开头。

🔹 问题3:想看变量实时变化怎么办?

打开Watch Window,添加你想监控的变量,比如:

GPIOC->ODR RCC->APB2ENR

还可以打开Memory Window,输入0x4001100C(GPIOC_ODR地址),实时观察寄存器变化。


九、进阶建议:让工程更专业、更易维护

✅ 工程结构组织

不要把所有文件丢在一个Group里。推荐分组方式:

- Core |- startup_stm32f103xb.s |- system_stm32f10x.c - Driver |- led.c / led.h - Middleware |- delay.c / delay.h - User App |- main.c

✅ 包含路径设置

C/C++→ Include Paths 中添加:

. ./Core ./Driver ./CMSIS

✅ 版本控制友好配置

.gitignore 中排除:

*.uvoptx ; 用户个性化设置,每人不同 *.build_log.htm ./Output/ ./Listings/

保留:

*.uvprojx ; 主工程文件,必须提交 main.c startup_*.s

十、结语:从“点亮LED”出发,走向更广阔的嵌入式世界

你现在掌握的,不仅仅是“Keil5怎么创建新工程”这个问题的答案。

你掌握了:
- 如何为特定MCU配置完整的开发环境;
- 启动文件的作用与必要性;
- 链接脚本如何影响程序布局;
- 寄存器级编程的基本方法;
- 调试与故障排查的核心技能。

这些能力,是你未来学习RTOS(FreeRTOS)、通信协议(UART/I2C/SPI)、低功耗设计、Bootloader开发的坚实基础。

下一次,当你面对一块全新的STM32G0、L4甚至H7芯片时,你会自信地说:

“我知道该怎么开始了。”


如果你在实现过程中遇到了具体问题,欢迎留言讨论。也可以告诉我你想下一个做什么——PWM呼吸灯?串口打印?还是移植FreeRTOS?我们可以一起继续深入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1121875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.2 磁性材料特性:软磁材料与永磁材料的特性及选型

2.2 磁性材料特性:软磁材料与永磁材料的特性及选型 在磁悬浮轴承系统中,磁性材料的性能直接决定了电磁执行器的出力密度、效率、动态响应及系统的整体可靠性。磁悬浮轴承主要涉及两大类磁性材料:软磁材料和永磁材料。软磁材料构成磁路的导磁部分(如定子铁芯、转子叠片),…

文本可读性分析神器:Textstat让复杂文本评估变得简单高效

文本可读性分析神器:Textstat让复杂文本评估变得简单高效 【免费下载链接】textstat :memo: python package to calculate readability statistics of a text object - paragraphs, sentences, articles. 项目地址: https://gitcode.com/gh_mirrors/tex/textstat …

Web开发:一图简述OAuth 2.0授权流程中的一些关键步骤

一、场景说明乙方需要调用甲方的系统的接口,甲方要求乙方凭借有效的accessToken访问,具体方式是甲方要求乙方通过OAuth2.0方式获取甲方的授权码后换取甲方的accessToken进行访问二、步骤解析1.准备参数乙方需要准备clientId、userMark、state、redirectU…

2.1 电磁场基本理论回顾

2.1 电磁场基本理论回顾 磁悬浮轴承的电磁力源于可控的磁场,其分析与设计的物理基础是经典电磁场理论。对电磁场基本定律的深刻理解,尤其是掌握其在工程简化模型——磁路中的应用,是进行磁轴承电磁力计算、磁场分析和优化设计的前提。本节旨在回顾与磁悬浮轴承直接相关的核…

Keil编译器下载v5.06(STM32版)超详细版安装说明

从零搭建稳定开发环境:Keil编译器 v5.06(STM32版)安装实战指南 你有没有遇到过这样的情况? 项目紧急,刚打开电脑准备调试STM32代码,uVision却弹出一个红色警告:“ Compiler Version 5 is not…

清华镜像站同步上线Qwen3Guard-Gen-8B,加速国内开发者获取

清华镜像站上线 Qwen3Guard-Gen-8B:为国产 AI 安全能力按下加速键 在生成式 AI 如火如荼的今天,大模型带来的创造力与风险并存。一句看似无害的提问,可能触发危险内容生成;一段用户输入,或许暗藏政治敏感或违法信息。而…

一站式获取:Qwen3Guard-Gen-8B镜像已上线GitCode开源平台

Qwen3Guard-Gen-8B 镜像上线 GitCode:让内容安全真正“理解”语义 在生成式 AI 被广泛嵌入聊天机器人、客服系统、创作平台的今天,一个看似不起眼但极为关键的问题正悄然浮现:我们如何确保模型不会说出不该说的话? 不是简单的脏…

【毕业设计】SpringBoot+Vue+MySQL 高校心理教育辅导设计与实现平台源码+数据库+论文+部署文档

摘要 随着社会快速发展,大学生心理健康问题日益突出,高校心理教育辅导的需求显著增加。传统心理咨询方式存在效率低、资源分配不均等问题,亟需一种信息化、智能化的解决方案。该平台旨在构建一个高效、便捷的心理教育辅导系统,帮助…

1.2 磁悬浮轴承的分类与发展

1.2 磁悬浮轴承的分类与发展 磁悬浮轴承是一种利用可控磁场力将转子无机械接触地悬浮于空间,并实现稳定支承的机电一体化部件。作为传统滚动轴承和滑动轴承的革命性替代技术,其核心价值在于通过消除摩擦,为旋转机械带来高效率、高速度、长寿命和低维护的卓越性能。本章节旨…

STM32F4+USB2.0大数据量传输稳定性实践

STM32F4 USB2.0 大数据量传输稳定性实战:从原理到跑满11Mbps你有没有遇到过这样的场景?手头的STM32F4项目需要实时上传多路ADC采样数据,采样率一上200kSPS,PC端就开始丢包;用串口?带宽根本扛不住。换成USB…

UltraISO制作启动盘安装Qwen3Guard-Gen-8B?可行吗?

UltraISO 制作启动盘安装 Qwen3Guard-Gen-8B?可行吗? 在生成式 AI 快速落地的今天,越来越多企业开始部署大模型服务。与此同时,内容安全问题也日益凸显:如何防止模型输出违法不良信息?怎样实现对多语言、复…

S32DS安装教程:小白指南之软件安装避坑

S32DS安装避坑全记录:从零开始搭建NXP嵌入式开发环境 你有没有试过兴致勃勃下载了S32 Design Studio,双击安装却卡在启动界面?或者好不容易装上了,一连调试器就报“ No debug hardware found ”?别急——这几乎是每…

手把手教你实现I2C读写EEPROM代码(零基础适用)

从零开始搞懂I2C读写EEPROM:手把手带你写出稳定可靠的存储代码你有没有遇到过这样的问题——设备断电后,之前设置的参数全没了?比如Wi-Fi密码要重新输入、屏幕亮度每次都要调一遍。这背后其实缺了一个“记忆”功能。今天我们就来解决这个问题…

工业环境下面向稳定性的51单片机LED配置方法

工业现场如何让51单片机的LED十年不坏?不只是“点亮”那么简单你有没有遇到过这样的情况:设备上电瞬间,LED“啪”地闪一下;运行中莫名其妙常亮或熄灭;甚至在工厂某台大电机启动时,指示灯直接失控乱跳&#…

启用Intel Math Kernel Library(MKL)优化数值计算

Anaconda加速AI模型训练的技术文章大纲1. 引言AI模型训练对计算资源的需求Anaconda在数据科学和AI开发中的核心作用加速训练的意义:效率提升与成本优化2. Anaconda环境配置优化使用Miniconda精简安装,减少冗余依赖创建专用虚拟环境隔离依赖冲突通过conda…

80亿参数推理模型DeepSeek-R1-Llama-8B开源

80亿参数推理模型DeepSeek-R1-Llama-8B开源 【免费下载链接】DeepSeek-R1-Distill-Llama-8B 开源项目DeepSeek-RAI展示前沿推理模型DeepSeek-R1系列,经大规模强化学习训练,实现自主推理与验证,显著提升数学、编程和逻辑任务表现。我们开放了D…

芝麻粒-TK:蚂蚁森林能量自动化收取的终极解决方案

芝麻粒-TK:蚂蚁森林能量自动化收取的终极解决方案 【免费下载链接】Sesame-TK 芝麻粒-TK 项目地址: https://gitcode.com/gh_mirrors/ses/Sesame-TK 还在为每天手动收取蚂蚁森林能量而烦恼吗?芝麻粒-TK为你带来了革命性的自动化体验!这…

Tmpwatch、Systemd-tmpfiles)

临时文件自动化管理方案技术文章大纲背景与需求分析临时文件的定义与常见类型(缓存、日志、下载中间文件等)手动管理的痛点:存储空间占用、安全风险、清理效率低下自动化管理的核心目标:效率提升、资源优化、安全性保障技术方案设…

蜂鸣器驱动电路在STM32中的应用操作指南

让蜂鸣器“唱”起来:STM32驱动电路实战全解析你有没有遇到过这样的场景?设备运行正常,但用户根本没注意到——因为没有任何提示音。或者报警时只靠LED闪烁,在嘈杂的工厂环境中形同虚设?声音,是最直接、最高…

Qwen3Guard-Gen-8B与阿里云其他安全产品的协同效应分析

Qwen3Guard-Gen-8B与阿里云安全体系的协同演进 在生成式AI加速落地的今天,内容安全已不再是一个“附加功能”,而是决定产品能否上线、能否出海、能否被用户信任的核心门槛。我们看到越来越多的大模型应用因一句不当输出被推上舆论风口——这背后暴露的不…