Keil5开发环境配置:为嵌入式端部署轻量化MogFace模型做准备

张开发
2026/4/12 7:52:18 15 分钟阅读

分享文章

Keil5开发环境配置:为嵌入式端部署轻量化MogFace模型做准备
Keil5开发环境配置为嵌入式端部署轻量化MogFace模型做准备如果你正打算把AI模型塞进一个小小的微控制器里比如让一个STM32也能识别人脸那么第一步往往不是去折腾模型而是搭建一个可靠的“工作台”。这个工作台就是嵌入式开发环境。今天我们就来手把手搞定这个基础但至关重要的环节——配置Keil5 MDK为后续将轻量化的MogFace人脸检测模型部署到STM32这类嵌入式设备铺平道路。很多朋友一上来就直奔模型转换和推理优化结果卡在环境配置、工程创建这些“简单”问题上非常打击积极性。其实磨刀不误砍柴工。一个配置正确、结构清晰的Keil工程就像一间收拾妥当的实验室能让你后续的模型集成、驱动调试事半功倍。这篇教程的目标很明确让你从零开始快速拥有一个能编译、能下载、能调试的STM32基础工程并准备好与外部世界比如接收模型推理结果的PC通信的串口驱动。1. 准备工作理清思路与获取资源在动手安装之前我们先花两分钟理清整个流程和需要的东西。这能帮你避免中途卡壳。你需要准备什么一台Windows电脑Keil MDK主要支持Windows系统。Keil MDK安装包我们将使用MDK-ARM版本它支持所有基于Cortex-M内核的ARM微控制器包括STM32。目标芯片的Device Family Pack (DFP)可以理解为芯片的支持包里面包含了你的STM32型号的寄存器定义、启动文件等。一个STM32开发板用于最终的程序下载和测试。型号不限但教程会以常见的STM32F103系列为例。为什么是Keil MDK对于ARM Cortex-M系列的开发Keil MDKMicrocontroller Development Kit是一个历史悠久且广泛使用的集成开发环境。它集成了编辑器、编译器、调试器和仿真器尤其对STM32的支持非常成熟资料丰富社区庞大非常适合初学者入门和项目快速开发。整体步骤预览我们的行动路线很清晰安装软件 → 激活可选→ 安装芯片包 → 创建第一个工程 → 编写基础驱动。跟着步骤走半小时内就能看到成果。2. 分步搭建安装与配置Keil5 MDK现在我们开始正式的安装与配置。请严格按照步骤操作。2.1 下载与安装Keil MDK首先访问Keil的官方网站或通过可靠的渠道获取MDK-ARM的安装程序。安装过程本身并不复杂。运行安装程序双击下载好的mdk*.exe安装文件。同意许可协议一路点击“Next”在出现许可协议时选择“I agree”。选择安装路径建议保持默认路径C:\Keil_v5或者选择一个没有中文和空格的路径例如D:\Keil_v5。这可以避免一些潜在的奇怪问题。填写用户信息这些信息可以随意填写对后续使用没有影响。等待安装完成点击“Next”开始安装这个过程可能需要几分钟。安装完成取消勾选“Show Release Notes”和“Add example projects to the recently used project list”然后点击“Finish”。安装完成后桌面上会出现“Keil uVision5”的快捷方式。先不要急着打开。2.2 安装STM32设备支持包Keil本身是一个空壳需要安装对应芯片的DFP包才能支持你的STM32。这就像给手机安装APP。打开Pack Installer有两种方式双击桌面“Keil uVision5”快捷方式在打开的软件界面中点击菜单栏Project - Manage - Pack Installer。或者直接运行开始菜单中Keil文件夹下的Pack Installer。在线安装在Pack Installer的“Device”选项卡下在搜索框输入“STM32F1”以F103为例你会看到“STMicroelectronics STM32F1 Series”的选项。点击右侧的“Install”按钮。软件会自动从服务器下载并安装最新的DFP包。如果网络较慢也可以提前从官网下载好.pack文件然后通过File - Import进行离线安装。验证安装安装完成后对应的“Install”按钮会变成“Up to date”或“Remove”。2.3 破解与激活可选仅供学习评估请注意Keil MDK是商业软件用于商业项目需要购买正版许可证。对于个人学习、评估和微控制器教育可以申请有限制的评估版或者使用社区提供的激活方法。评估版有32KB代码大小的限制对于初学和小型实验是足够的。如果你需要进行不受限制的学习可以在网络上搜索“Keil MDK License Management”按照相关指引使用Keygen工具生成许可证并在Keil的File - License Management对话框中添加。这里出于版权考虑不展开具体步骤请自行寻找合法合规的评估途径。3. 创建你的第一个STM32工程环境搭好了我们来建一个“Hello World”级别的STM32工程。这个工程将作为我们后续集成MogFace模型的基础框架。3.1 新建工程与选择芯片启动Keil并新建项目打开Keil uVision5点击Project - New uVision Project。选择工程路径和名称为你即将开始的“嵌入式AI之旅”创建一个专属文件夹例如STM32_MogFace_Base。进入该文件夹给工程起个名字比如MogFace_Base然后点击保存。选择目标设备在弹出的设备选择窗口中找到你的STM32型号。我们以STMicroelectronics-STM32F1 Series-STM32F103-STM32F103C8这是最常见的“蓝屏”核心板型号为例。选中后点击“OK”。管理运行时环境接下来会弹出“Manage Run-Time Environment”对话框。这是一个非常方便的功能可以图形化地添加中间件、设备驱动等。对于最基础的工程我们暂时什么都不选直接点击“OK”。后续需要库函数时再来这里添加。3.2 添加必要的工程文件一个最简单的可执行工程至少需要启动文件由芯片厂商提供包含芯片复位后最先执行的汇编代码负责初始化堆栈、设置中断向量表等。主程序文件我们写的C代码入口。链接脚本Keil在创建工程时会自动生成一个基本的链接脚本.sct它告诉编译器如何把代码、数据放到芯片内存的哪个位置。添加启动文件在Keil左侧的“Project”窗口中右键点击“Target 1”选择Manage Project Items。在“Project Items”选项卡下点击“Groups”区域下方的“New (Insert)”按钮新建一个组命名为Startup。选中新建的Startup组点击右侧“Files”区域下方的“Add Files”按钮。导航到Keil的安装目录通常路径为C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.x.x\Device\Source\ARM。找到文件startup_stm32f103xb.s根据你的芯片型号可能略有不同选中并添加。这是一个汇编写的启动文件。创建并添加主程序文件在“Project”窗口中右键点击“Source Group 1”选择Add New Item to Group Source Group 1。选择“C File (.c)”命名为main.c保存到你的工程目录下。现在你的工程结构应该看起来像这样Target 1 ├── Startup │ └── startup_stm32f103xb.s └── Source Group 1 └── main.c3.3 编写一个简单的测试程序双击打开main.c文件我们来写一个最简单的程序让一个LED闪烁如果你的开发板有LED的话或者至少让程序能成功编译。// main.c #include stm32f1xx.h // 这是STM32F1系列的标准外设头文件Keil通过DFP包提供了它 // 简单的延时函数通过循环消耗时间来实现 void Delay(uint32_t count) { for(uint32_t i 0; i count; i); } int main(void) { // 1. 启用GPIOC的时钟STM32任何外设使用前必须先开启其时钟 RCC-APB2ENR | RCC_APB2ENR_IOPCEN; // 2. 配置PC13引脚为推挽输出模式假设LED连接在PC13请根据你的开发板修改 // 对于F1需要配置CNFy[1:0]和MODEy[1:0]。这里设置CNF1300通用推挽输出MODE1301输出模式最大速度10MHz GPIOC-CRH ~(GPIO_CRH_CNF13 | GPIO_CRH_MODE13); // 先清零 GPIOC-CRH | GPIO_CRH_MODE13_0; // MODE13 01 while (1) { // 3. 点亮LED假设低电平点亮 GPIOC-BSRR GPIO_BSRR_BR13; // 将PC13置低 Delay(500000); // 4. 熄灭LED GPIOC-BSRR GPIO_BSRR_BS13; // 将PC13置高 Delay(500000); } }3.4 配置编译选项与生成HEX文件为了让工程能正确编译并为后续下载做准备我们需要进行几项关键配置。设置目标选项右键点击“Target 1”选择Options for Target Target 1。Device选项卡确认芯片型号正确。Target选项卡Xtal (MHz)填写你的外部晶振频率比如8.0。Use MicroLIB勾选此项。MicroLIB是一个高度优化的C库专为嵌入式设计可以显著减少代码体积对于资源紧张的MCU非常重要。Output选项卡勾选Create HEX File。HEX文件是最终要烧录到芯片里的程序文件。C/C选项卡Define在这里可以定义全局宏。对于标准外设库可能需要添加USE_STDPERIPH_DRIVER。我们目前使用直接寄存器操作暂时不需要。Include Paths添加头文件搜索路径。点击末尾的“...”添加你的工程目录以及可能需要用到的库文件目录。目前我们的main.c只包含了来自DFP包的头文件其路径已被Keil自动管理所以可以先不添加。Debug选项卡在这里选择你的调试器比如ST-Link、J-Link等。并点击“Settings”确认连接和端口SWD设置正确。点击“OK”保存所有配置。现在点击工具栏上的“Build”按钮或按F7。如果一切配置正确你将在下方的“Build Output”窗口看到MogFace_Base.axf - 0 Error(s), 0 Warning(s)的提示。恭喜你的第一个STM32工程编译成功了4. 编写基础通信驱动打通与PC的桥梁模型在嵌入式端运行后我们需要把检测结果比如人脸坐标发送出来查看。最常用、最简单的方式就是串口UART。我们来为工程添加串口驱动。4.1 初始化USART外设我们使用USART1它通常连接到STM32的PA9TX和PA10RX引脚。在main.c文件中我们添加一个串口初始化函数。为了清晰我们在main.c里直接实现。// 在main.c文件顶部添加以下函数声明和定义 #include stdio.h // 为了使用printf重定向 void USART1_Init(uint32_t baudrate) { // 1. 使能时钟 RCC-APB2ENR | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN; // 2. 配置GPIOPA9为复用推挽输出(TX) PA10为浮空输入(RX) // 配置PA9 GPIOA-CRH ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9); GPIOA-CRH | GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9_0; // CNF910 (复用输出), MODE901 (10MHz) // 配置PA10 GPIOA-CRH ~(GPIO_CRH_CNF10 | GPIO_CRH_MODE10); GPIOA-CRH | GPIO_CRH_CNF10_0; // CNF1001 (浮空输入), MODE1000 (输入模式) // 3. 配置USART参数 USART1-BRR SystemCoreClock / baudrate; // 设置波特率 USART1-CR1 | USART_CR1_TE | USART_CR1_RE; // 使能发送和接收 USART1-CR1 | USART_CR1_UE; // 使能USART } // 简单的发送一个字符的函数 void USART1_SendChar(char ch) { while (!(USART1-SR USART_SR_TXE)); // 等待发送数据寄存器空 USART1-DR (ch 0xFF); } // 发送字符串 void USART1_SendString(char *str) { while (*str) { USART1_SendChar(*str); } }4.2 重定向printf到串口可选但推荐为了方便调试我们可以将C库的printf函数重定向到串口这样就能像在PC上一样打印信息了。// 在main.c中添加以下代码实现fputc重定向 #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker-Libraries-Small printf set to Yes) calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ PUTCHAR_PROTOTYPE { USART1_SendChar(ch); return ch; }4.3 在主函数中测试串口修改main函数初始化串口并发送一条欢迎信息。int main(void) { // 初始化系统时钟为了准确计算波特率通常需要配置系统时钟。这里为了简化假设使用默认的8MHz HSI // 实际项目中需要正确配置SystemCoreClock变量。这里我们简单设置一个值。 SystemCoreClock 8000000; // 假设系统时钟是8MHz // 初始化串口波特率115200 USART1_Init(115200); USART1_SendString(\r\n*** STM32 Keil5 Base Project Ready for MogFace! ***\r\n); // ... 你之前的LED初始化代码 ... while (1) { // ... LED闪烁代码 ... // 可以每隔一段时间通过printf发送状态 // printf(System is running...\r\n); // Delay(1000000); } }编译并下载程序到开发板。使用串口调试助手如Putty、SecureCRT或单片机常用的XCOM连接到开发板的串口1PA9/PA10设置波特率115200你应该能看到接收区打印出的欢迎信息。5. 常见问题与解决思路第一次配置难免会遇到问题这里列举几个常见的编译错误‘RCC’ undeclared检查是否包含了正确的设备头文件#include “stm32f1xx.h”以及DFP包是否安装成功。程序下载失败检查调试器如ST-Link驱动是否安装。在Keil的Options for Target - Debug设置中是否正确选择了调试器和接口SWD。检查开发板的供电和连接线。串口无输出检查波特率是否与代码设置一致如115200。检查TX/RX线是否接反开发板的TX应接USB转串口工具的RX。确认USART引脚配置是否正确PA9, PA10。用万用表测量PA9引脚在发送数据时是否有电平变化。代码大小超限如果使用评估版编译后提示代码超过32KB可以尝试确保勾选了“Use MicroLIB”。优化编译器选项Options for Target - C/C - Optimization选择-O2或-O3。移除不必要的代码和库。6. 总结与下一步到这里你已经成功搭建起了嵌入式AI部署的第一块基石。我们完成了Keil5 MDK环境的安装、芯片支持包的配置、创建了一个结构清晰的STM32基础工程并且编写了最关键的串口通信驱动。这个工程框架已经具备了接收指令、发送数据比如人脸检测的坐标和置信度的能力。用起来感觉怎么样是不是觉得步骤虽然多但一步步来其实并不复杂。这个环境就像你熟悉的代码编辑器一样以后会是你最常用的工具之一。接下来你的战场将转向AI模型本身。你需要获取并了解MogFace模型这是一个轻量级的人脸检测模型你需要拿到它的结构定义和训练好的权重。模型转换与量化使用如TensorFlow Lite for Microcontrollers、STM32Cube.AI或NCNN等工具将模型转换为适合在Cortex-M内核上运行的、经过量化的C代码。集成到本工程将生成的模型推理代码集成到我们刚刚创建的Keil工程中并调用我们写好的串口驱动来输出结果。驱动摄像头与优化如果需要实时检测还需要集成摄像头驱动如DCMI接口并着手进行性能优化内存管理、算子加速等。每一步都是一个有趣的挑战。但请放心你已经走好了最关键的第一步——拥有一个稳定可靠的开发环境。现在可以自信地开始你的嵌入式AI之旅了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章