遇见兰兰 發表於 2026-3-12 10:37:00

Keil MDK(uVision5)完全指导手册(个人总结,篇幅有限)

<h2 id="目录">目录</h2>
<ol>
<li>环境搭建与安装</li>
<li>基础入门:第一个项目</li>
<li>项目管理与配置</li>
<li>调试技术详解</li>
<li>高级应用与优化</li>
<li>常见问题与解决方案</li>
</ol>
<hr>
<h2 id="一环境搭建与安装">一、环境搭建与安装</h2>
<h3 id="11-系统要求">1.1 系统要求</h3>
<ul>
<li><strong>操作系统</strong>:Windows 7/8/10/11(64位推荐)</li>
<li><strong>处理器</strong>:Intel Pentium 4 或更高</li>
<li><strong>内存</strong>:最低2GB,推荐4GB或以上</li>
<li><strong>硬盘空间</strong>:至少2GB可用空间</li>
</ul>
<h3 id="12-软件安装步骤">1.2 软件安装步骤</h3>
<h4 id="步骤1下载安装包">步骤1:下载安装包</h4>
<ol>
<li>访问Keil官方网站下载MDK安装包(MDK5xx.EXE)</li>
<li>或从国内镜像/云盘获取安装包(注意验证文件完整性)</li>
</ol>
<h4 id="步骤2安装主程序">步骤2:安装主程序</h4>
<ol>
<li>右键点击安装程序,选择<strong>"以管理员身份运行"</strong></li>
<li>点击 <strong>Next</strong> 进入安装向导</li>
<li>勾选 <strong>"I agree to all the terms..."</strong> 接受许可协议,点击 <strong>Next</strong></li>
<li>修改安装路径(建议改为D盘等非系统盘,如 <code>D:\Keil_v5</code>),点击 <strong>Next</strong></li>
<li>填写注册信息(可随意填写):
<ul>
<li>First Name: 任意</li>
<li>Last Name: 任意</li>
<li>Company: 任意</li>
<li>Email: 任意格式</li>
</ul>
</li>
<li>点击 <strong>Next</strong> 开始安装,等待进度条完成</li>
<li>取消勾选 <strong>"Show Release Notes"</strong>,点击 <strong>Finish</strong></li>
</ol>
<h4 id="步骤3软件注册license激活">步骤3:软件注册(License激活)</h4>
<ol>
<li>打开Keil uVision5,点击菜单 <strong>File → License Management</strong></li>
<li>复制 <strong>CID</strong>(Computer ID)框中的代码</li>
<li>运行注册机程序(需管理员权限),将CID粘贴到对应位置</li>
<li>Target选择 <strong>ARM</strong>,Prof. Developers选择 <strong>Professional</strong></li>
<li>点击 <strong>Generate</strong> 生成许可证代码(LIC)</li>
<li>复制LIC代码,粘贴到Keil的 <strong>New License ID Code (LIC)</strong> 框中</li>
<li>点击 <strong>Add LIC</strong>,显示 <strong>"LIC Added Successfully"</strong> 即激活成功</li>
</ol>
<h4 id="步骤4安装设备支持包dfp">步骤4:安装设备支持包(DFP)</h4>
<p>Keil采用Pack机制管理不同厂商的芯片支持:</p>
<ol>
<li>打开Keil,点击工具栏 <strong>Pack Installer</strong> 图标(或菜单 <strong>Project → Manage → Pack Installer</strong>)</li>
<li>在左侧 <strong>Devices</strong> 栏选择芯片厂商(如STMicroelectronics)</li>
<li>在右侧选择具体芯片系列(如STM32F1 Series)</li>
<li>点击 <strong>Install</strong> 按钮安装对应的DFP(Device Family Pack)</li>
<li>等待安装完成,关闭Pack Installer</li>
</ol>
<blockquote>
<p><strong>国内用户提示</strong>:Pack下载可能较慢,可提前从Keil官网下载 <code>.pack</code> 文件,双击本地安装</p>
</blockquote>
<hr>
<h2 id="二基础入门第一个项目">二、基础入门:第一个项目</h2>
<h3 id="21-创建新项目以stm32为例">2.1 创建新项目(以STM32为例)</h3>
<h4 id="步骤1新建工程">步骤1:新建工程</h4>
<ol>
<li>打开Keil uVision5,点击菜单 <strong>Project → New uVision Project...</strong></li>
<li>选择项目保存路径(建议新建专用文件夹,如 <code>D:\Projects\LED_Blink</code>)</li>
<li>输入项目名称(如 <code>LED_Blink</code>),点击 <strong>保存</strong></li>
</ol>
<h4 id="步骤2选择目标设备">步骤2:选择目标设备</h4>
<ol>
<li>在 <strong>Select Device for Target</strong> 对话框中展开厂商列表</li>
<li>选择 <strong>STMicroelectronics → STM32F1 Series → STM32F103C8</strong></li>
<li>点击 <strong>OK</strong> 确认</li>
</ol>
<h4 id="步骤3添加启动文件和库">步骤3:添加启动文件和库</h4>
<ol>
<li>弹出 <strong>Manage Run-Time Environment</strong> 对话框</li>
<li>勾选必要组件:
<ul>
<li><strong>CMSIS → CORE</strong>(核心支持)</li>
<li><strong>Device → Startup</strong>(启动文件)</li>
<li><strong>Device → GPIO</strong>(如需使用GPIO)</li>
</ul>
</li>
<li>点击 <strong>Resolve</strong> 自动解决依赖关系</li>
<li>点击 <strong>OK</strong> 完成配置</li>
</ol>
<h4 id="步骤4创建源文件">步骤4:创建源文件</h4>
<ol>
<li>在 <strong>Project</strong> 窗口中右键点击 <strong>Source Group 1</strong></li>
<li>选择 <strong>Add New Item to Group 'Source Group 1'...</strong></li>
<li>选择 <strong>C File (.c)</strong>,命名为 <code>main.c</code></li>
<li>点击 <strong>Add</strong> 创建文件</li>
</ol>
<h4 id="步骤5编写第一个程序led闪烁">步骤5:编写第一个程序(LED闪烁)</h4>
<pre><code class="language-c">#include "stm32f10x.h"

// 简单延时函数
void delay_ms(uint32_t ms) {
    for(uint32_t i = 0; i &lt; ms * 8000; i++) {
      __NOP();// 空操作指令
    }
}

int main(void) {
    // 使能GPIOC时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
   
    // 配置PC13为推挽输出
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &amp;GPIO_InitStruct);
   
    while(1) {
      GPIO_SetBits(GPIOC, GPIO_Pin_13);    // LED灭
      delay_ms(500);
      GPIO_ResetBits(GPIOC, GPIO_Pin_13);// LED亮
      delay_ms(500);
    }
}
</code></pre>
<h3 id="22-编译与下载">2.2 编译与下载</h3>
<h4 id="编译项目">编译项目</h4>
<ol>
<li>点击工具栏 <strong>Build</strong> 按钮(或按 <strong>F7</strong>)</li>
<li>查看 <strong>Build Output</strong> 窗口,确认 <strong>"0 Error(s), 0 Warning(s)"</strong></li>
<li>生成的.hex文件位于项目目录的 <code>Objects</code> 文件夹中</li>
</ol>
<h4 id="下载到开发板">下载到开发板</h4>
<ol>
<li>连接ST-Link调试器到电脑和开发板</li>
<li>点击工具栏 <strong>Options for Target</strong> 按钮(或按 <strong>Alt+F7</strong>)</li>
<li>切换到 <strong>Debug</strong> 标签,选择 <strong>ST-Link Debugger</strong></li>
<li>点击 <strong>Settings</strong>,确认Port为 <strong>SW</strong>(Serial Wire)</li>
<li>点击 <strong>OK</strong> 保存设置</li>
<li>点击 <strong>Download</strong> 按钮(或按 <strong>F8</strong>)下载程序</li>
<li>观察开发板LED是否开始闪烁</li>
</ol>
<hr>
<h2 id="三项目管理与配置">三、项目管理与配置</h2>
<h3 id="31-工程选项详细配置options-for-target">3.1 工程选项详细配置(Options for Target)</h3>
<h4 id="target选项卡">Target选项卡</h4>
<ul>
<li><strong>Xtal (MHz)</strong>:设置外部晶振频率(如8.0MHz)</li>
<li><strong>Operating system</strong>:选择是否使用RTOS(如RTX)</li>
<li><strong>System Viewer File</strong>:指定SVDF文件用于外设寄存器查看</li>
</ul>
<h4 id="output选项卡">Output选项卡</h4>
<ul>
<li><strong>Create HEX File</strong>:勾选生成.hex文件用于烧录</li>
<li><strong>Browse Information</strong>:勾选启用代码浏览和跳转</li>
<li><strong>Select Folder for Objects</strong>:指定编译输出目录</li>
</ul>
<h4 id="cc选项卡关键配置">C/C++选项卡(关键配置)</h4>
<ul>
<li><strong>Define</strong>:添加预定义宏,如:
<ul>
<li><code>USE_HAL_DRIVER</code>(使用HAL库)</li>
<li><code>STM32F103xB</code>(芯片型号定义)</li>
</ul>
</li>
<li><strong>Optimization</strong>:优化级别选择
<ul>
<li>Level 0:无优化(调试推荐)</li>
<li>Level 3:最高优化(发布版本)</li>
</ul>
</li>
<li><strong>C99 Mode</strong>:勾选启用C99标准支持</li>
<li><strong>Include Paths</strong>:添加头文件搜索路径(如 <code>./Inc</code>, <code>./Drivers</code>)</li>
</ul>
<h4 id="debug选项卡">Debug选项卡</h4>
<ul>
<li><strong>Use Simulator</strong>:使用软件仿真(无需硬件)</li>
<li><strong>Use Debugger</strong>:选择硬件调试器(ST-Link/J-Link/ULINK等)</li>
<li><strong>Settings</strong>:配置调试接口参数(SWD/JTAG)</li>
</ul>
<h3 id="32-多文件项目管理">3.2 多文件项目管理</h3>
<h4 id="文件组织结构建议">文件组织结构建议</h4>
<pre><code>Project/
├── Core/
│   ├── Inc/          # 头文件
│   └── Src/          # 源文件
├── Drivers/          # 库文件
├── Middleware/       # 中间件
├── Startup/          # 启动文件
└── Output/         # 编译输出
</code></pre>
<h4 id="添加文件到工程">添加文件到工程</h4>
<ol>
<li>在Project窗口右键点击目标组(如 <strong>Source Group 1</strong>)</li>
<li>选择 <strong>Manage Project Items...</strong></li>
<li>点击 <strong>Add Files...</strong> 选择.c/.s文件</li>
<li>或使用 <strong>Add New Group</strong> 创建新的文件组(如 <code>Drivers</code>, <code>Middleware</code>)</li>
</ol>
<h3 id="33-使用run-time-environmentrte">3.3 使用Run-Time Environment(RTE)</h3>
<p>RTE是Keil MDK的软件组件管理系统:</p>
<ol>
<li>点击 <strong>Project → Manage → Run-Time Environment</strong></li>
<li>浏览可用的软件组件:
<ul>
<li><strong>CMSIS</strong>:核心支持、DSP库、NN库</li>
<li><strong>Device</strong>:启动文件、外设驱动</li>
<li><strong>Keil Middleware</strong>:文件系统、网络、USB协议栈</li>
<li><strong>Board Support</strong>:板级支持包</li>
</ul>
</li>
<li>勾选所需组件,点击 <strong>Resolve</strong> 自动检查依赖</li>
<li>点击 <strong>OK</strong> 自动添加文件到工程</li>
</ol>
<hr>
<h2 id="四调试技术详解">四、调试技术详解</h2>
<h3 id="41-基础调试操作">4.1 基础调试操作</h3>
<h4 id="启动调试会话">启动调试会话</h4>
<ol>
<li>点击 <strong>Debug → Start/Stop Debug Session</strong>(或按 <strong>Ctrl+F5</strong>)</li>
<li>或点击工具栏 <strong>Debug</strong> 按钮进入调试模式</li>
</ol>
<h4 id="断点设置">断点设置</h4>
<ul>
<li><strong>设置/取消断点</strong>:在代码行号左侧单击,或右键选择 <strong>Insert/Remove Breakpoint</strong></li>
<li><strong>条件断点</strong>:右键断点选择 <strong>Breakpoint Properties...</strong>,设置条件表达式(如 <code>i == 100</code>)</li>
<li><strong>临时断点</strong>:设置后执行一次自动删除</li>
</ul>
<h4 id="单步执行">单步执行</h4>
<ul>
<li><strong>Step Over (F10)</strong>:执行当前行,不进入函数内部</li>
<li><strong>Step Into (F11)</strong>:执行当前行,进入函数内部</li>
<li><strong>Step Out (Ctrl+F11)</strong>:执行完当前函数,返回调用处</li>
<li><strong>Run to Cursor (Ctrl+F10)</strong>:运行到光标所在行</li>
</ul>
<h3 id="42-变量与内存查看">4.2 变量与内存查看</h3>
<h4 id="watch窗口变量监视">Watch窗口(变量监视)</h4>
<ol>
<li>进入调试模式后,打开 <strong>View → Watch Windows → Watch 1</strong></li>
<li>在 <strong>Name</strong> 列输入变量名(如 <code>counter</code>, <code>GPIOA-&gt;IDR</code>)</li>
<li>按 <strong>Enter</strong> 显示当前值,可实时观察变量变化</li>
<li>支持表达式:如 <code>(float)adc_value / 4096 * 3.3</code></li>
</ol>
<h4 id="memory窗口内存查看">Memory窗口(内存查看)</h4>
<ol>
<li>打开 <strong>View → Memory Windows → Memory 1</strong></li>
<li>在地址框输入地址(如 <code>0x20000000</code> 查看SRAM)</li>
<li>支持多种显示格式:Hex、ASCII、Float等</li>
<li>可直接修改内存值(双击数值)</li>
</ol>
<h4 id="寄存器查看">寄存器查看</h4>
<ul>
<li>打开 <strong>View → Registers Window</strong> 查看CPU寄存器</li>
<li>打开 <strong>View → Peripherals</strong> 查看外设寄存器(需正确配置SVD文件)</li>
</ul>
<h3 id="43-高级调试功能">4.3 高级调试功能</h3>
<h4 id="逻辑分析仪logic-analyzer">逻辑分析仪(Logic Analyzer)</h4>
<ol>
<li>打开 <strong>View → Analysis Windows → Logic Analyzer</strong></li>
<li>点击 <strong>Setup...</strong> 添加观察信号</li>
<li>输入变量名或地址(如 <code>PORTA</code>, <code>0x4001080C</code>)</li>
<li>设置显示类型(Bit、Analog等)</li>
<li>运行程序,实时观察波形变化</li>
</ol>
<h4 id="调用栈call-stack">调用栈(Call Stack)</h4>
<ul>
<li>打开 <strong>View → Call Stack Window</strong> 查看函数调用层级</li>
<li>双击函数名可跳转到对应代码位置</li>
<li>用于分析程序崩溃时的调用路径</li>
</ul>
<h4 id="串口调试serial-window">串口调试(Serial Window)</h4>
<ol>
<li>打开 <strong>View → Serial Windows → UART #1</strong></li>
<li>自动捕获程序中UART1的输出数据</li>
<li>也可用于模拟输入数据到串口</li>
</ol>
<hr>
<h2 id="五高级应用与优化">五、高级应用与优化</h2>
<h3 id="51-编译优化配置">5.1 编译优化配置</h3>
<h4 id="优化级别选择">优化级别选择</h4>
<p>在 <strong>Options for Target → C/C++ → Optimization</strong> 中选择:</p>
<table>
<thead>
<tr>
<th>级别</th>
<th>说明</th>
<th>适用场景</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Level 0</strong></td>
<td>无优化,调试信息最完整</td>
<td>开发调试阶段</td>
</tr>
<tr>
<td><strong>Level 1</strong></td>
<td>基本优化,保留大部分调试信息</td>
<td>初步优化测试</td>
</tr>
<tr>
<td><strong>Level 2</strong></td>
<td>高优化,可能影响调试</td>
<td>性能测试阶段</td>
</tr>
<tr>
<td><strong>Level 3</strong></td>
<td>最高优化,调试信息可能丢失</td>
<td>最终发布版本</td>
</tr>
</tbody>
</table>
<h4 id="代码大小优化技巧">代码大小优化技巧</h4>
<ol>
<li>勾选 <strong>One ELF Section per Function</strong>:删除未使用的函数</li>
<li>使用 <code>__attribute__((unused))</code> 标记可能未使用的变量</li>
<li>启用 <strong>Link-Time Optimization (LTO)</strong>(如编译器支持)</li>
</ol>
<h3 id="52-使用middleware中间件">5.2 使用Middleware中间件</h3>
<p>Keil MDK-Professional提供丰富的中间件组件:</p>
<h4 id="添加中间件步骤">添加中间件步骤</h4>
<ol>
<li>打开 <strong>Manage Run-Time Environment</strong></li>
<li>选择 <strong>Keil Middleware</strong> 类别</li>
<li>勾选需要的组件:
<ul>
<li><strong>File System</strong>:FAT文件系统支持</li>
<li><strong>Network</strong>:TCP/IP协议栈</li>
<li><strong>USB Device</strong>:USB设备协议栈</li>
<li><strong>USB Host</strong>:USB主机协议栈</li>
<li><strong>GUI</strong>:图形用户界面(emWin)</li>
</ul>
</li>
<li>配置组件参数(通过对应的配置文件)</li>
<li>编写应用代码调用API</li>
</ol>
<h4 id="示例添加fat文件系统">示例:添加FAT文件系统</h4>
<pre><code class="language-c">#include "rl_fs.h"

// 初始化文件系统
fsInitialize();

// 挂载SD卡
fsMount("M0:", "SD:");

// 文件操作
FILE *fp = fopen("M0:test.txt", "w");
fprintf(fp, "Hello Keil!\n");
fclose(fp);
</code></pre>
<h3 id="53-脚本编程与自动化">5.3 脚本编程与自动化</h3>
<h4 id="使用调试脚本ini文件">使用调试脚本(.ini文件)</h4>
<p>创建调试配置文件实现自动化操作:</p>
<pre><code class="language-ini">// debug.ini 示例
FUNC void Setup(void) {
    SP = _RDWORD(0x08000000);   // 设置栈指针
    PC = _RDWORD(0x08000004);   // 设置程序计数器
    XPSR = 0x01000000;            // 设置xPSR
}

FUNC void GPIO_Init(void) {
    _WDWORD(0x40021018, 0x00000010);// 使能GPIOC时钟
    _WDWORD(0x40011004, 0x00100000);// 配置PC13
}

Setup();                        // 调用初始化函数
GPIO_Init();
</code></pre>
<p>在 <strong>Options for Target → Debug → Initialization File</strong> 中指定该脚本。</p>
<h4 id="自定义编译后操作">自定义编译后操作</h4>
<p>在 <strong>Options for Target → User</strong> 标签中配置:</p>
<ul>
<li><strong>Run #1</strong>:编译前执行的命令</li>
<li><strong>Run #2</strong>:编译后执行的命令</li>
<li>示例:自动生成.bin文件<pre><code>fromelf --bin --output output.bin output.axf
</code></pre>
</li>
</ul>
<hr>
<h2 id="六常见问题与解决方案">六、常见问题与解决方案</h2>
<h3 id="61-安装与注册问题">6.1 安装与注册问题</h3>
<table>
<thead>
<tr>
<th>问题</th>
<th>解决方案</th>
</tr>
</thead>
<tbody>
<tr>
<td>注册时提示 <strong>"LIC is invalid"</strong></td>
<td>确认CID复制完整(无空格),检查注册机Target选择是否正确</td>
</tr>
<tr>
<td>Pack安装失败</td>
<td>以管理员身份运行Keil,或手动下载.pack文件双击安装</td>
</tr>
<tr>
<td>找不到设备</td>
<td>确认已安装对应厂商的DFP包,重启Keil</td>
</tr>
</tbody>
</table>
<h3 id="62-编译错误">6.2 编译错误</h3>
<table>
<thead>
<tr>
<th>错误提示</th>
<th>解决方案</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>"undefined symbol"</strong></td>
<td>检查是否添加了对应的.c文件到工程,或缺少库文件</td>
</tr>
<tr>
<td><strong>"cannot open source input file"</strong></td>
<td>在C/C++选项中添加正确的Include Paths</td>
</tr>
<tr>
<td><strong>"No space in execution regions"</strong></td>
<td>芯片Flash/RAM不足,优化代码或更换大容量型号</td>
</tr>
<tr>
<td><strong>"multiple definition"</strong></td>
<td>检查是否有重复定义的变量或函数,使用<code>extern</code>声明</td>
</tr>
</tbody>
</table>
<h3 id="63-调试问题">6.3 调试问题</h3>
<table>
<thead>
<tr>
<th>问题</th>
<th>解决方案</th>
</tr>
</thead>
<tbody>
<tr>
<td>无法连接调试器</td>
<td>检查接线(SWDIO/SWCLK/GND),确认驱动已安装,重启调试器</td>
</tr>
<tr>
<td>程序不运行或跑飞</td>
<td>检查启动文件是否正确,向量表地址配置,时钟配置</td>
</tr>
<tr>
<td>断点无效</td>
<td>确认代码已编译并下载,优化级别设为0,检查Flash断点数量限制</td>
</tr>
<tr>
<td>变量值显示异常</td>
<td>检查变量是否被优化(volatile声明),确认作用域正确</td>
</tr>
</tbody>
</table>
<h3 id="64-中文显示与编码">6.4 中文显示与编码</h3>
<ol>
<li>
<p><strong>编辑器中文乱码</strong>:</p>
<ul>
<li>点击 <strong>Edit → Configuration → Editor</strong></li>
<li>Encoding选择 <strong>Chinese GB2312 (Simplified)</strong> 或 <strong>UTF-8</strong></li>
</ul>
</li>
<li>
<p><strong>printf输出中文乱码</strong>:</p>
<ul>
<li>确保串口工具编码与Keil一致</li>
<li>使用 <code>printf("%s", "中文\r\n");</code> 格式</li>
</ul>
</li>
</ol>
<hr>
<h2 id="附录学习资源">附录:学习资源</h2>
<h3 id="官方资源">官方资源</h3>
<ul>
<li>Keil官方文档中心:www.keil.com/support/man_docs.asp</li>
<li>Keil学习平台:www.keil.com/learn(视频教程)</li>
</ul>
<h3 id="推荐书籍">推荐书籍</h3>
<ul>
<li>《ARM Cortex-M3与Cortex-M4权威指南》</li>
<li>《嵌入式系统设计与实践》</li>
</ul>
<h3 id="国内社区">国内社区</h3>
<ul>
<li>正点原子、野火电子等STM32教程</li>
<li>CSDN、知乎Keil相关专栏</li>
</ul>
<hr>
<p>本手册基于Keil官方Getting Started指南及行业实践经验编写,涵盖从软件安装、基础项目创建、调试技巧到高级中间件应用的完整学习路径。建议初学者按照章节顺序实践,每个阶段都确保掌握后再进入下一阶段。</p><br><br>
来源:https://www.cnblogs.com/zhucl-logs/p/19706886
頁: [1]
查看完整版本: Keil MDK(uVision5)完全指导手册(个人总结,篇幅有限)