首页 / 资讯中心 / 文章详情

STM32CubeMX 6.14全流程实战:从安装配置到USB虚拟串口开发

STM32CubeMX 6.14全流程实战:从安装配置到USB虚拟串口开发 ★ FEATURED ARTICLE
1. 为什么我劝你先把STM32CubeMX这个工具吃透搞STM32开发的人绕不开一个工具——STM32CubeMX。这东西刚出来那几年很多人还抱着标准外设库不放觉得图形化配置是新手玩具手动写寄存器才显得专业。但到了2026年如果你还在一个个查参考手册配时钟树、算分频系数那真的是在浪费生命。STM32CubeMX 6.14这个版本已经把芯片选型、引脚分配、时钟树配置、中间件集成、代码生成这一整条链路打通了你只需要点几下鼠标它就能给你生成一套可以直接编译的HAL库工程框架。我第一次接触STM32CubeMX的时候踩了不少坑。下载装了半天打开发现芯片包没装选不了型号好不容易装好芯片包生成代码又报错时钟树配错了串口死活不出数据。这些经历让我意识到网上很多教程只告诉你点这里、点那里但没告诉你为什么要这样点以及点错了会怎样。所以这篇文章我打算把STM32CubeMX 6.14从下载、安装、配置到生成第一个工程的全流程掰开揉碎了讲清楚顺便把那些年我踩过的坑和总结的技巧一并分享出来。这篇文章适合谁看如果你是刚接触STM32的新手跟着走一遍就能把环境搭起来如果你是从标准库转过来的老手可以重点看看时钟树配置和代码生成策略那几节如果你已经用了一段时间但总觉得配置不够顺手那常见问题排查那部分应该能帮到你。我不打算只讲操作步骤更想把每个配置项背后的逻辑讲明白这样你遇到新芯片、新需求的时候自己能判断该怎么配。2. 下载与安装别在第一步就卡住2.1 官网下载的正确姿势与版本选择STM32CubeMX的下载渠道我只推荐一个ST官网。别去什么第三方下载站那些地方要么版本老旧要么捆绑一堆你不需要的东西。打开ST官网找到STM32CubeMX的产品页面你会看到几个不同平台的安装包。Windows用户选.exeLinux用户选.deb或者.rpmmacOS用户选.dmg。这里有个细节要注意6.14版本对操作系统是有要求的Windows这边至少得是Win10 64位Win7虽然理论上能跑但实测会有各种奇怪的兼容性问题不建议折腾。下载之前你需要注册一个ST账号。这个账号是免费的但必须用真实邮箱因为后续下载芯片包、申请License都和账号绑定。我见过有人用临时邮箱注册结果后面想下载F7系列的芯片包时账号被限制又得重新注册白白浪费时间。注册流程很简单填邮箱、设密码、验证邮件点一下就行。版本选择上6.14是2025年底发布的稳定版相比6.10之前的版本主要改进在三个方面一是对STM32U5、H5这些新系列的支持更完善二是代码生成引擎优化了生成的工程结构更清晰三是修复了之前版本中时钟树配置偶尔崩溃的问题。如果你用的是比较新的芯片建议直接上6.14如果项目用的是老芯片比如F1036.10也够用但没必要刻意降级。注意下载页面有时候会提供最新版和长期支持版两个选项。长期支持版更新慢但更稳定适合量产项目最新版功能全但可能有未知bug适合学习和评估。我一般两个都下新项目用最新版维护老项目用LTS版。2.2 安装过程中的关键选项与避坑点安装包下载下来之后双击运行。安装向导前面几步都是常规的下一步但到了选择安装路径这一步我建议你改一下默认路径。默认是装在C盘的Program Files下面这个路径有空格某些老版本的命令行工具处理带空格的路径会出问题。我一般装到D:\ST\STM32CubeMX这种没有空格、没有中文的路径下。安装类型选择那里会让你选Complete还是Custom。如果你硬盘空间够直接选Complete省事。但如果你的C盘比较紧张可以选Custom把不必要的文档和示例代码去掉。不过说实话STM32CubeMX本体并不大占空间的主要是后续下载的芯片包所以这里不用太纠结。安装过程中有一个选项容易被忽略Associate .ioc files with STM32CubeMX。这个一定要勾上。.ioc文件是STM32CubeMX的工程配置文件勾上之后双击.ioc文件就能直接打开配置界面不用先开软件再找文件。我见过有人没勾这个每次打开工程都要手动去File菜单里找效率低不说还容易开错文件。安装完成后第一次启动会提示你选择工作空间Workspace。这个工作空间是用来存放芯片包和临时文件的默认在用户目录下。如果你的C盘空间不大建议改到其他盘。我一般设成D:\STM32CubeMX\workspace这样芯片包也放在这里重装系统的时候不会丢。2.3 芯片包的安装与管理策略STM32CubeMX装好之后打开你会发现芯片列表是空的或者只有很少几个型号。这是因为芯片包Device Family Pack需要单独下载。点击菜单栏的Help然后选Manage embedded software packages会弹出一个包管理窗口。这里你会看到ST所有的芯片系列从F0到H7还有MP1、WB、WL这些无线系列。每个系列下面有多个版本我建议你只装自己需要的系列别全装。全装的话光F4一个系列就好几个G硬盘吃不消。而且包太多的话每次打开软件加载列表都会变慢。装哪个版本一般来说选最新的就行。但有个例外如果你用的是Keil MDK或者IAR来编译代码芯片包的版本要和你的IDE兼容。比如Keil MDK 5.38最高支持到某个版本的F4包你装了更新的包生成代码时可能会提示固件库版本不匹配。这个后面讲代码生成的时候会细说。下载芯片包的时候网络状况很关键。ST的服务器在国外国内下载速度有时候不太理想。我的经验是早上七八点或者晚上十一点以后下载速度会快很多。如果实在慢得受不了可以找找国内高校的镜像源但要注意版本是否和官网一致。实操心得芯片包下载支持断点续传但如果你中途关了软件下次打开需要重新点下载它会从上次断的地方继续。所以下载大包的时候别频繁开关软件让它安安静静下完。3. 新建工程与芯片选型从零开始搭框架3.1 新建工程的两种入口与适用场景打开STM32CubeMX 6.14你会看到主界面有两个大的入口一个是New Project一个是Access to MCU Selector。这两个有什么区别New Project是直接新建一个空白工程然后让你选芯片MCU Selector是先让你浏览和筛选芯片选好了再建工程。我一般用MCU Selector因为筛选功能更直观。点击MCU Selector之后你会看到一个芯片列表上面有各种筛选条件系列Series、封装Package、Flash大小、引脚数等等。比如你要做USB设备那筛选条件里就要勾上USB Device要做超声波测距那至少得有个定时器用来做输入捕获筛选条件里勾上Timer。这个筛选功能很实用能帮你快速缩小范围不用一个个翻数据手册。选芯片的时候有个细节列表里同一个型号可能有多个条目比如STM32F103C8T6和STM32F103C8T6TR。这两个其实是同一个芯片TR只是表示编带包装对开发没影响。随便选一个就行。3.2 芯片选型的核心考量因素选芯片不是越贵越好也不是引脚越多越好得看你的项目需求。我一般从这几个维度来考虑第一是Flash和RAM。这个决定了你能写多少代码、跑多少变量。以F103C8T6为例64KB Flash、20KB RAM跑个简单的串口通信、定时器中断绰绰有余但你要是想跑FreeRTOS再加个文件系统那就很紧张了。我的经验是Flash至少留30%余量RAM至少留40%余量不然后期加功能会很痛苦。第二是外设需求。你要做USB设备那芯片必须带USB外设要做CAN通信那得有CAN控制器要做电机控制那高级定时器带互补输出和死区控制是必须的。这些在选型的时候就要确认好别等画完板子才发现芯片不支持。第三是封装和引脚数。这个和你的PCB设计直接相关。LQFP48、LQFP64、LQFP100引脚越多焊接越难但可用IO也越多。如果是手工焊接LQFP48已经是极限了再密就得用热风枪或者回流焊。QFN封装更小但更难焊新手不建议碰。第四是供货和价格。这个在2026年依然是个现实问题。有些芯片虽然性能好但供货不稳定价格波动大。我一般会选那些出货量大、替代型号多的芯片比如F103系列就算某个型号缺货换个同系列的也能pin-to-pin替换。3.3 工程命名与路径设置的讲究选好芯片之后会弹出一个工程配置窗口。这里要填工程名称和存储路径。工程名称我建议用英文别用中文也别用空格。比如USB_Device_Test就比USB设备测试好因为后面生成的代码里工程名会出现在很多地方中文路径在某些编译器下会出问题。路径设置也有讲究。我一般会在硬盘上建一个专门的STM32工程目录比如D:\STM32_Projects然后每个项目一个子文件夹。这样所有工程集中管理找起来方便备份也方便。别把工程建在桌面或者C盘用户目录下一是路径太长容易出问题二是重装系统的时候容易丢。还有一个选项是Application Structure让你选Basic还是Advanced。Basic就是所有代码都放在一个文件夹里结构简单Advanced会按外设分文件夹结构更清晰但文件更多。我一般选Basic因为HAL库的代码组织已经够清晰了再分文件夹反而找起来麻烦。但如果你做的是大项目多人协作那Advanced可能更合适。4. 引脚配置与时钟树最容易出错的两个环节4.1 引脚分配的操作逻辑与冲突处理进入配置界面之后你会看到一个芯片的俯视图每个引脚旁边有标签。左边是引脚列表右边是外设列表。配置引脚有两种方式一种是在芯片图上直接点引脚然后选功能另一种是在左边列表里找到对应的外设点它然后选引脚。我一般用第二种因为更直观不容易点错。举个例子你要配置USART1。在左边列表里找到USART1点开你会看到TX和RX两个信号。点TX旁边的下拉框它会列出所有可以作为USART1_TX的引脚你选一个就行。选好之后芯片图上对应的引脚会变成绿色表示已配置。这里有个坑有些引脚是复用的比如PA9既可以做USART1_TX也可以做TIM1_CH2还可以做普通IO。如果你先配了USART1_TX在PA9后面又想用TIM1_CH2那就冲突了。STM32CubeMX会检测到冲突把冲突的引脚标成黄色或者红色并在下面给出提示。这时候你就得权衡一下哪个功能更重要把另一个功能换到别的引脚上。还有一种情况是引脚被固定功能占用了比如晶振引脚OSC_IN、OSC_OUT、复位引脚NRST、调试引脚SWDIO、SWCLK。这些引脚一般不能随便改功能STM32CubeMX会默认把它们标成绿色或者灰色你点它们的时候会提示不能配置。这是正常的别想着把SWDIO改成普通IO除非你确定不再需要调试功能。注意配置引脚的时候尽量把同一组外设的引脚放在相邻的位置这样PCB布线会容易很多。比如USART1的TX和RX如果能在PA9和PA10上那就别一个放PA9一个放PB7走线绕来绕去不说还容易引入干扰。4.2 时钟树配置的底层逻辑与参数计算时钟树是STM32CubeMX里最让人头疼的部分但也是最核心的部分。很多人配时钟树就是照着教程抄抄完了也不知道为什么这么配。我试着把逻辑讲清楚。STM32的时钟源主要有四个HSI内部高速时钟一般8MHz或16MHz、HSE外部高速时钟一般接8MHz晶振、LSI内部低速时钟约32kHz、LSE外部低速时钟一般接32.768kHz晶振。HSI精度差但不需要外部元件HSE精度高但需要外接晶振。做USB设备的话必须用HSE因为USB对时钟精度要求很高HSI满足不了。以STM32F103C8T6为例假设你接了一个8MHz的HSE晶振想跑到72MHz的主频。配置流程是这样的首先在时钟树界面把HSE选成Crystal/Ceramic Resonator然后在PLL Source Mux那里选HSE。接着配置PLLHSE是8MHz先除以一个分频系数PLLM再乘以倍频系数PLLN再除以一个分频系数PLLP得到PLLCLK。对于F103PLLM固定是1有些系列可配PLLN可以选2到16PLLP可以选2、4、6、8。我们要得到72MHz8MHz乘以9等于72MHz所以PLLN选9PLLP选272/236不对这里要仔细看。等等我重新算一下。F103的PLL结构是PLLCLK HSE / PLLM * PLLN / PLLP。但F103的PLLM固定为1PLLP固定为2实际上F103的PLL输出就是HSE * PLLN / 2也不对。让我查一下F103的时钟树F103的PLL输入是HSE8MHz或者HSE/2。PLL倍频系数是2到16。PLL输出直接就是系统时钟没有PLLP分频。所以8MHz * 9 72MHzPLL倍频选9就行。但到了F4系列PLL结构就复杂了PLLCLK HSE / PLLM * PLLN / PLLP。比如F407HSE是8MHzPLLM选8得到1MHz的PLL输入PLLN选336得到336MHz的VCO输出PLLP选2得到168MHz的系统时钟。这个计算过程STM32CubeMX会自动帮你算你只需要在界面上输入目标频率它会自动调整参数。但你要知道它在算什么不然出了问题不知道怎么排查。时钟树配好之后还要注意各个总线的分频系数。AHB、APB1、APB2的频率不能超过芯片手册规定的最大值。比如F103的APB1最大36MHzAPB2最大72MHz。如果你把APB1也设成72MHzSTM32CubeMX会标红提示错误你得把APB1的分频系数改成2让它变成36MHz。实操心得配置时钟树的时候先把HSE和LSE配好再配PLL最后配总线分频。顺序反了的话中间步骤可能会因为时钟源没选对而报错。另外如果USB要用记得检查USB时钟是不是48MHzF103的USB时钟是从PLLCLK除以1.5得到的所以PLLCLK必须是72MHz才能得到48MHz。4.3 外设参数配置的常见误区引脚和时钟配好之后就是各个外设的具体参数了。以USART为例你需要配波特率、数据位、停止位、校验位。这些参数看起来简单但有几个地方容易出错。波特率方面STM32CubeMX会根据你选的时钟频率自动计算分频系数但有时候算出来的实际波特率和你要的有偏差。比如你要115200它可能算出115384误差0.16%这个在允许范围内。但如果误差超过2%通信就会不稳定。你可以在配置界面看到实际波特率如果偏差太大就调整时钟频率或者换个波特率。数据位和停止位一般用默认的8位数据、1位停止位就行。校验位看你的通信协议如果对方要求奇偶校验那就得配上。这里有个坑如果你开了校验位数据位要相应调整。比如8位数据奇校验实际上数据位还是8位但校验位占了一位所以总帧长是10位1起始8数据1校验1停止。这个在配置的时候STM32CubeMX会自动处理但你得知道原理不然和对方通信不上会一头雾水。中断配置也是容易忽略的地方。比如你要用USART接收中断那得在NVIC设置里把USART1 global interrupt勾上。不勾的话生成的代码里不会初始化中断你写的中断服务函数永远不会被调用。我见过有人调了半天串口接收最后发现是中断没开。5. 代码生成与工程管理让工具帮你干活5.1 工程设置中的关键选项解读外设配好之后点Project Manager标签进入工程设置。这里有几个选项直接影响生成的代码结构我一个个说。第一个是Toolchain/IDE。这个要和你实际用的编译器匹配。Keil MDK选MDK-ARMIAR选IAR EWARMSTM32CubeIDE选STM32CubeIDEMakefile选Makefile。选错了的话生成的工程文件你的IDE打不开。我一般用Keil MDK所以选MDK-ARM版本选最新的V5。第二个是Minimum Heap Size和Minimum Stack Size。这两个是给动态内存分配和函数调用栈用的。默认Heap是0x200512字节Stack是0x4001024字节。如果你用了malloc或者跑了RTOSHeap要加大我一般设成0x8002KB起步。Stack的话如果函数嵌套深或者局部变量多也要加大0x800比较保险。第三个是Generate peripheral initialization as a pair of .c/.h files per peripheral。这个选项如果勾上每个外设的初始化代码会单独生成一个.c和.h文件比如usart.c、usart.h。不勾的话所有初始化代码都堆在main.c里。我建议勾上这样代码结构清晰后期维护方便。特别是外设多的时候main.c不会变得又臭又长。第四个是Backup previously generated files when re-generating。这个一定要勾上。它的作用是当你修改配置重新生成代码时之前生成的main.c会被备份成main.c.bak你手动添加的代码不会丢。但要注意它只备份main.c其他文件比如usart.c如果被你改过重新生成时会被覆盖。所以我的习惯是所有用户代码都写在main.c的USER CODE BEGIN和USER CODE END之间这样重新生成不会丢。5.2 代码生成策略与用户代码保护STM32CubeMX生成的代码里有很多这样的注释块/* USER CODE BEGIN 2 */ /* 用户代码写在这里 */ /* USER CODE END 2 */这些注释块之间的代码在重新生成时不会被覆盖。所以你的业务逻辑、自定义函数调用都要写在这些块里面。块外面的代码是工具生成的你改了也会被覆盖别费那个劲。但有个问题如果你在USER CODE块里定义了一个函数然后在块外面调用了它重新生成后块外面的调用没了函数就变成了未使用。所以我的做法是所有函数定义和调用都放在USER CODE块里块外面只保留工具生成的初始化代码。还有一个技巧如果你需要在多个外设的初始化之间插入代码比如在USART初始化之后、TIM初始化之前做点什么那可以在对应的初始化函数调用后面找USER CODE块。STM32CubeMX在每个外设初始化调用后面都留了USER CODE块很方便。5.3 编译环境对接与首次编译验证代码生成之后点Open Project按钮它会自动打开你选的IDE。以Keil MDK为例打开之后先别急着编译检查几个地方。第一确认芯片型号选对了。Keil的Options for Target里Device标签页应该显示你选的STM32型号。如果不对可能是芯片包没装或者版本不匹配。第二确认调试器配置。Debug标签页里选ST-Link Debugger或者J-Link然后点Settings确认能识别到芯片。如果识别不到检查接线和驱动。第三确认头文件路径。C/C标签页里Include Paths应该包含HAL库的头文件路径和你的工程目录。STM32CubeMX生成的工程一般会自动配好但有时候路径会错特别是你改了工程路径之后。这些都确认了点编译。第一次编译可能会比较慢因为要编译整个HAL库。编译通过后你会看到生成的.hex或者.bin文件。这时候可以连上开发板点下载把程序烧进去。如果编译报错最常见的原因是芯片包版本和HAL库版本不匹配。比如你装的F4芯片包是1.27.0但生成的代码用的是1.28.0的HAL库那就会报一堆未定义的错误。解决办法是在STM32CubeMX的包管理里把芯片包更新到和HAL库一致的版本或者反过来把HAL库降到和芯片包一致的版本。注意首次编译通过之后建议先烧一个最简单的LED闪烁程序验证环境。别一上来就写复杂功能万一有问题你分不清是环境问题还是代码问题。LED闪烁验证通过说明时钟、GPIO、下载链路都是通的后面再写复杂功能就有底了。6. 常见问题与排查技巧实录6.1 下载与安装阶段的典型问题问题一官网下载速度极慢或者断连。这个前面提过换个时间段下载或者用下载工具挂后台慢慢下。别用浏览器自带的下载断点续传支持不好。问题二安装时报错无法写入文件。一般是权限问题。右键安装包选以管理员身份运行。如果还不行检查杀毒软件是不是拦截了临时关掉再装。问题三打开软件提示Java环境错误。STM32CubeMX是基于Java的需要Java运行环境。6.14版本自带JRE一般不会出这个问题。如果出了去官网下个最新的JRE装上。问题四芯片包下载失败提示Connection timeout。检查网络如果用了代理把代理关掉。ST的服务器有时候会抽风等一会儿再试。6.2 配置阶段的常见错误与解决问题五时钟树配好之后生成代码时提示Clock configuration error。一般是某个总线的频率超过了最大值。检查AHB、APB1、APB2的分频系数确保都在手册规定的范围内。另外如果用了USB检查USB时钟是不是48MHz。问题六引脚配置冲突但不知道哪个功能冲突了。在芯片图上冲突的引脚会标成黄色或红色。把鼠标悬停在上面会显示冲突的功能。如果看不出来点Pinout菜单里的Clear Pinout把所有引脚清空重新配一遍。问题七生成代码后编译报错undefined reference to HAL_xxx。一般是HAL库文件没加进工程。检查工程目录下的Drivers/STM32Fxxx_HAL_Driver文件夹看看对应的.c文件在不在。如果不在重新生成代码确保Copy only necessary library files选项没勾错。问题八串口通信乱码。先检查波特率对不对再检查时钟频率对不对。如果时钟频率错了波特率也会错。用示波器或者逻辑分析仪量一下TX引脚看看波形对不对。如果波形对但数据错检查数据位、停止位、校验位。6.3 代码生成后的调试技巧问题九程序下载后不运行。先检查复位电路再检查BOOT引脚。BOOT0接地BOOT1接地是从Flash启动。如果BOOT0接高就从系统存储器启动你的程序不会跑。问题十中断进不去。检查NVIC配置确认中断使能了。再检查中断服务函数的名称对不对STM32CubeMX生成的中断函数名是固定的比如USART1_IRQHandler你写成USART1_Handler就不会被调用。问题十一重新生成代码后之前写的代码丢了。检查是不是写在了USER CODE块外面。如果是把代码移到USER CODE块里面。另外确认Backup previously generated files选项勾上了。问题十二Keil编译提示Flash Download failed。检查调试器配置确认芯片型号选对了。如果用的是ST-Link检查驱动装没装。有时候是芯片被读保护了用ST-Link Utility解除保护再试。问题现象可能原因排查步骤解决方法下载速度慢服务器在国外换时间段凌晨下载或找镜像安装报错权限不足检查权限管理员运行时钟树报错频率超限检查分频系数调整分频引脚冲突功能复用查看冲突提示换引脚或换功能编译报错库文件缺失检查Drivers目录重新生成代码串口乱码波特率或时钟错量波形调整时钟或波特率中断不进NVIC未使能检查配置勾选中断使能代码丢失写在USER块外检查代码位置移入USER块6.4 独家避坑经验分享第一个经验别在虚拟机里跑STM32CubeMX。我试过在VMware里装图形界面卡得要死而且USB设备识别经常出问题。如果非要用虚拟机至少给4GB内存和独立显卡直通。第二个经验工程路径别用中文和空格。这个坑我踩过好几次。有一次工程路径里有中文Keil编译时报了一堆奇怪的错误查了半天才发现是路径问题。后来所有工程都用纯英文路径再没出过这个问题。第三个经验定期备份.ioc文件。.ioc文件是STM32CubeMX的工程配置丢了就得重新配一遍。我一般用Git管理每次改完配置就commit一次。这样就算配错了也能回滚到之前的版本。第四个经验芯片包别贪多。我一开始把所有系列的芯片包都下了结果STM32CubeMX启动要等半分钟选芯片的时候列表长得翻不到底。后来只留了常用的F1、F4、H7三个系列启动秒开。第五个经验生成代码前先点Project Manager里的Advanced Settings。这里可以设置每个外设生成的代码是Copy only necessary library files还是Copy all used library files。选前者的话只复制你用到的外设的库文件工程体积小选后者的话所有库文件都复制工程体积大但兼容性好。我一般选前者省空间。7. 从配置到实战一个USB虚拟串口的完整示例7.1 需求分析与外设选型光讲配置不够直观我拿一个实际例子走一遍用STM32F103C8T6做一个USB虚拟串口设备通过USB向电脑发送数据。这个需求在热词里也出现了很多人做毕业设计或者项目会用。为什么选USB虚拟串口因为它不需要额外的USB转串口芯片直接利用STM32自带的USB外设插上电脑就能识别出一个串口。对于F103C8T6来说它有一个USB Device外设支持全速USB 2.0足够做虚拟串口。外设需求分析USB Device必须、USART1可选用来调试、TIM2可选用来定时发送数据。时钟方面USB需要48MHz时钟F103的USB时钟是从PLLCLK分频得到的所以PLLCLK必须是72MHz然后除以1.5得到48MHz。7.2 逐步配置过程记录第一步新建工程选STM32F103C8T6。在MCU Selector里搜F103C8选第一个。第二步配置时钟。在Pinout界面找到RCC把HSE设为Crystal/Ceramic Resonator。然后进Clock Configuration把HSE选上PLL Source选HSEPLL Mul选9倍频系统时钟源选PLLCLK。这样系统时钟就是72MHz。然后检查USB时钟应该是48MHz如果不是检查USB预分频器。第三步配置USB。在Connectivity里找到USB把Device (FS)选上。这时候PA11和PA12会被自动配置为USB_DM和USB_DP。这两个引脚是固定的不能改。第四步配置USB中间件。在Middleware里找到USB_DEVICEClass选Communication Device Class (Virtual Port Com)。这样就会生成CDC类的USB设备代码。第五步配置USART1用于调试。在Connectivity里找到USART1Mode选Asynchronous引脚会自动分配到PA9和PA10。波特率设115200。第六步配置NVIC。在System Core里找到NVIC把USB中断使能优先级设成默认就行。第七步工程设置。在Project Manager里工程名填USB_VCP_Test路径选D:\STM32_ProjectsToolchain选MDK-ARM V5。勾上Generate peripheral initialization as a pair of .c/.h files和Backup previously generated files。第八步生成代码。点GENERATE CODE等它生成完点Open Project打开Keil。7.3 关键代码解读与功能验证打开Keil之后找到main.c在USER CODE BEGIN 2和USER CODE END 2之间添加发送数据的代码。USB CDC的发送函数是CDC_Transmit_FS定义在usbd_cdc_if.c里。你可以这样调用uint8_t buffer[] Hello from STM32 USB VCP!\r\n; CDC_Transmit_FS(buffer, sizeof(buffer) - 1);但要注意CDC_Transmit_FS不能连续调用太快因为USB发送是异步的上一次没发完就调下一次会返回USBD_BUSY。所以最好加个延时或者用状态机。编译下载之后把开发板通过USB线插到电脑上。电脑会识别出一个新的串口设备在设备管理器里能看到USB Serial Device。打开串口助手选这个串口波特率随便设USB虚拟串口的波特率是假的设多少都行就能收到STM32发来的数据了。如果收不到数据检查几个地方一是USB线是不是数据线有些线只能充电不能传数据二是电脑有没有装STM32的USB驱动Win10一般会自动装Win7可能需要手动装三是代码里有没有调用CDC_Transmit_FS以及调用时机对不对。实操心得USB虚拟串口第一次插上电脑时可能会提示设备描述符请求失败。这一般是时钟配置不对USB时钟不是精确的48MHz。检查PLL配置确保系统时钟是72MHzUSB预分频是1.5。另外USB的DP引脚PA12需要上拉电阻有些开发板已经内置了如果没有得外接一个1.5kΩ的上拉电阻到3.3V。8. 版本管理与工程维护的长期策略8.1 用Git管理STM32CubeMX工程STM32CubeMX工程里哪些文件该进Git哪些不该进我的做法是.ioc文件必须进因为它是配置的源头生成的代码可以进但要注意排除编译产物Drivers目录下的HAL库文件可以进但如果你用的是芯片包里的库也可以不进因为重新生成代码时会自动复制。具体来说.gitignore文件里应该排除这些*.o、*.axf、*.hex、*.bin、*.map、*.lst、Objects/、Listings/。这些是编译产物每次编译都会变没必要进版本库。.ioc文件进Git的好处是你可以随时看到配置的变更历史。比如你改了时钟频率Git会显示.ioc文件里哪一行变了。这样出问题的时候可以快速定位是哪次配置改动导致的。8.2 多版本芯片包的兼容处理有时候你维护的老项目用的是旧版芯片包新项目用的是新版两个项目在同一台电脑上开发怎么处理我的做法是在STM32CubeMX的包管理里同时保留新旧两个版本。新建工程时选新版打开老工程时它会自动用老版的包。但要注意如果你用新版包重新生成了老工程的代码可能会引入不兼容的改动。比如HAL库的某个函数签名变了你的代码就编译不过了。所以老工程除非必要别用新版包重新生成。如果非要升级先在Git里开个分支升级完测试通过再合并。8.3 工程模板化与复用技巧如果你经常做类似的项目比如每次都是F103USART定时器那可以做一个工程模板。配置好一次之后把.ioc文件另存为模板下次新建工程时直接复制这个.ioc文件改个名字就能用。这样省去了重复配置的时间。但要注意模板里的引脚配置和外设参数可能不适用于新项目复制之后要仔细检查一遍。特别是时钟树如果新项目用的晶振频率不一样时钟树得重新配。还有一个技巧是把常用的USER CODE块代码整理成一个代码片段库。比如USB发送、串口接收中断处理、定时器回调这些常用功能的代码可以存成单独的.c和.h文件需要的时候直接加到工程里。这样比每次重新写要快得多而且不容易出错。9. 我个人的一些使用体会STM32CubeMX这个工具刚上手的时候会觉得步骤多、选项杂但用熟了之后它确实能省下大量查手册、算参数的时间。我现在的习惯是新项目先用STM32CubeMX把框架搭起来生成代码后在Keil里写业务逻辑。遇到需要精细控制的地方比如某些时序要求严格的场景再直接操作寄存器。有一点要提醒STM32CubeMX生成的代码是基于HAL库的HAL库为了通用性有些地方效率不如直接操作寄存器。如果你的项目对性能要求极高比如高频PWM或者高速ADC采样那可能需要在HAL库的基础上做一些优化或者关键部分直接用寄存器操作。但对于大多数应用来说HAL库的性能已经足够了。另外STM32CubeMX的版本更新比较频繁每次更新都可能带来一些变化。我的建议是如果当前版本用着没问题别急着升级。等新版本出来一段时间社区反馈稳定了再升。升级之前先在Git里备份当前工程万一新版本有问题可以随时回退。最后分享一个小技巧STM32CubeMX的配置文件.ioc其实是文本格式的你可以用文本编辑器打开看。里面记录了所有的配置参数包括引脚、时钟、外设。有时候图形界面里找不到的配置项可以在.ioc文件里直接改。但改之前一定要备份改错了可能导致工程打不开。
阅读完成 · 觉得有帮助?
咨询建站