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

STM32Cube_FW_F1_V1.8.0固件包安装与Keil工程配置实战指南

STM32Cube_FW_F1_V1.8.0固件包安装与Keil工程配置实战指南 ★ FEATURED ARTICLE
简介STM32Cube_FW_F1_V1.8.0 是意法半导体面向 STM32F1 系列微控制器推出的官方固件库属于 STM32Cube 生态的核心组成适合嵌入式初学者、工程师及高校师生用于外设驱动开发与项目快速原型验证。包内集成 HAL 与 LL 双层驱动覆盖 ADC、CAN、GPIO、I2C、SPI、TIM、USART 等常用外设并附带 USB OTG、FatFS、FreeRTOS 等中间件、丰富应用示例以及 HAL/LL API 参考文档兼容 Keil MDK、IAR 与 GCC ARM 等主流开发环境。压缩包为 rar 格式整体约 95.73MB文件类型以驱动源码、头文件、工程示例与说明文档为主便于按外设模块检索与移植。目前已有 1088 人学习下载读者可借此掌握 HAL 与 LL 的取舍策略、中间件集成方式及 STM32CubeMX 生成代码的工程组织思路从而把精力集中在应用逻辑设计上减少底层硬件细节的重复摸索。1. 从一次 Keil 编译报错说起STM32Cube_FW_F1_V1.8.0 到底装的是什么前阵子帮一个做工业控制的朋友排查问题他那边用 Keil MDK 编译一个 STM32F103 的工程报错提示stm32f1xx_hal.h找不到同时core_cm3.h的版本也对不上。他以为是自己 Keil 装坏了重装了两遍 MDK问题依旧。实际上这是典型的固件包没装对或者装漏了——他电脑里只有一个零散的 HAL 库文件夹CMSIS 内核文件是从别的工程里拷过来的版本和 HAL 库不匹配。STM32Cube_FW_F1_V1.8.0 这个包就是 ST 官方为 STM32F1 全系列F101、F102、F103、F105、F107打包的一整套固件库里面包含 HAL 库、LL 库、CMSIS 内核文件、板级支持包 BSP、以及大量外设例程。装好它等于把 F1 系列开发需要的地基一次性铺平。这篇文章适合刚接触 STM32F1 的开发者也适合那些工程能编译但总出玄学问题的老手——很多时候不是代码写错了是固件包版本和目录结构没理清楚。2. 装之前先对版本STM32Cube_FW_F1_V1.8.0 的目录结构与依赖清单2.1 这个包里到底有什么解压 STM32Cube_FW_F1_V1.8.0.rar 之后你会看到一个名为STM32Cube_FW_F1_V1.8.0的根目录。我一般会先花两分钟把目录结构过一遍因为后面配 Keil 或 STM32CubeIDE 的路径时全靠这个结构定位。核心目录如下目录内容用途Drivers/CMSIS内核头文件、启动文件、系统初始化所有 Cortex-M3 工程的基础Drivers/STM32F1xx_HAL_DriverHAL 库源码与头文件外设驱动如 GPIO、UART、SPIDrivers/BSP官方评估板驱动用官方板时可直接调用MiddlewaresUSB、FatFs、FreeRTOS 等中间件需要时再引入不必全加Projects各评估板的例程工程验证环境是否装好的最佳素材Utilities杂项工具与配置文件部分例程依赖V1.8.0 这个版本对应的是较新的 HAL 库 API和早期 V1.4.0、V1.6.0 相比部分函数名和句柄结构有调整。如果你从旧工程迁移过来直接替换 HAL 库文件大概率会编译报错因为HAL_GPIO_Init之类的函数参数类型变了。常见做法是要么整体升级工程要么继续用旧版固件包不要混搭。2.2 版本选择与兼容性对照STM32F1 系列的固件包有好几个版本V1.8.0 不是最新的但它是很多量产项目仍在用的稳定版。我整理了一个简单的对照方便你判断该不该用这个版本固件包版本HAL 库风格适合场景V1.4.0早期 API函数名较旧维护老工程不想改代码V1.6.0过渡版本部分中间件例程依赖V1.8.0较新 API结构清晰新工程、学习、迁移到 CubeMXV1.8.1小幅修补如果拿不到 V1.8.0 可用如果你用 STM32CubeMX 生成代码它默认会拉取某个版本的固件包。V1.8.0 在 CubeMX 的固件包管理器里通常显示为STM32Cube FW_F1 V1.8.0。注意CubeMX 下载的固件包和这个 rar 包内容一致但目录位置不同CubeMX 会把它放在用户目录下的STM32Cube/Repository里。手动解压的包需要你自己在 IDE 里指定路径。2.3 安装前的环境检查在动手解压之前先确认三件事第一你的 IDE 是 Keil MDK、IAR EWARM 还是 STM32CubeIDE。Keil 和 IAR 需要手动添加头文件路径和源文件分组CubeIDE 可以直接导入例程。第二确认你用的是 STM32F1 的具体型号比如 F103C8T6、F103ZET6不同型号的启动文件和链接脚本不同。第三检查磁盘空间完整解压后大约 500MB 到 700MB路径里不要有中文和空格否则 Keil 有时会找不到文件。提示解压前先关掉 Keil 或 IAR避免解压过程中 IDE 索引旧文件导致缓存混乱。3. 手动安装到 Keil MDK从解压到第一个工程编译通过3.1 解压与目录放置我一般会把固件包放在一个固定的根目录比如D:\STM32\STM32Cube_FW_F1_V1.8.0。不要放在桌面或下载文件夹里因为后面工程引用路径会写死移动文件夹会导致路径失效。解压命令用 7-Zip 或 WinRAR 都行如果你在命令行下可以这样# 假设 rar 文件在 D:\Downloads解压到 D:\STM32 # 使用 7-Zip 命令行需先安装 7-Zip 并加入 PATH 7z x D:\Downloads\STM32Cube_FW_F1_V1.8.0.rar -oD:\STM32解压完成后检查D:\STM32\STM32Cube_FW_F1_V1.8.0\Drivers\STM32F1xx_HAL_Driver\Src下是否有stm32f1xx_hal_gpio.c等文件。如果没有说明解压不完整重新解压一次。3.2 在 Keil 中新建工程并添加文件分组打开 Keil MDK新建一个工程选择你的目标芯片比如STM32F103C8。然后在工程窗口里建立几个分组我习惯这样分CMSIS放system_stm32f1xx.c和启动文件startup_stm32f103xb.sHAL_Driver放stm32f1xx_hal.c、stm32f1xx_hal_gpio.c、stm32f1xx_hal_rcc.c等你实际用到的外设源文件User放你自己的main.c、stm32f1xx_it.c等启动文件在Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/arm下根据你的芯片型号选。F103C8 选startup_stm32f103xb.sF103ZE 选startup_stm32f103xe.s。选错启动文件会导致中断向量表不对程序跑飞。3.3 配置头文件路径与预定义宏这是最容易翻车的一步。点击 Keil 的 Options for Target进入 C/C 选项卡在 Include Paths 里添加以下路径D:\STM32\STM32Cube_FW_F1_V1.8.0\Drivers\STM32F1xx_HAL_Driver\Inc D:\STM32\STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Include D:\STM32\STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Include然后在 Define 框里填入两个宏USE_HAL_DRIVER STM32F103xBUSE_HAL_DRIVER告诉 HAL 库启用驱动STM32F103xB是芯片型号宏必须和你的芯片一致。如果你用的是 F103ZE就改成STM32F103xE。这两个宏写错编译时会出现大量未定义引用。3.4 复制并修改配置文件HAL 库需要一个stm32f1xx_hal_conf.h文件来裁剪外设模块。这个文件在Drivers/STM32F1xx_HAL_Driver/Inc下有一个模板stm32f1xx_hal_conf_template.h。把它复制到你的工程 User 目录重命名为stm32f1xx_hal_conf.h然后打开它确保你用的外设模块宏是打开的比如#define HAL_GPIO_MODULE_ENABLED #define HAL_RCC_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED用不到的模块可以注释掉减小代码体积。注意这个文件里还有一个HSE_VALUE宏默认是 8000000也就是 8MHz 外部晶振。如果你的板子用的是 12MHz 晶振这里要改成 12000000否则串口波特率会不对。3.5 编译验证与常见报错处理点击编译如果一切正常应该 0 错误 0 警告。如果报错cannot open source input file stm32f1xx_hal.h说明 Include Paths 没加对。如果报错undefined symbol HAL_Init说明stm32f1xx_hal.c没加到工程分组里。如果报错L6218E: Undefined symbol SystemInit说明system_stm32f1xx.c没加。这些都是路径和文件分组的问题不是代码问题。注意Keil 的编译缓存有时会作怪改完路径后如果还报旧错误点一次 Rebuild All 而不是 Build。4. 在 STM32CubeIDE 中导入例程最快跑通环境的方法4.1 为什么推荐先跑例程如果你不确定自己的配置对不对最稳妥的办法是直接用固件包里的官方例程。Projects目录下有针对不同评估板的例程比如STM32F103RB-Nucleo下的Examples/GPIO/GPIO_IOToggle。用 CubeIDE 导入这个例程编译下载如果 LED 能闪说明固件包本身没问题你的硬件和工具链也正常。之后再基于这个例程改自己的代码比从零建工程省事得多。4.2 导入步骤与路径设置打开 STM32CubeIDE选择 File - Import - General - Existing Projects into Workspace。在 Select root directory 里定位到D:\STM32\STM32Cube_FW_F1_V1.8.0\Projects\STM32F103RB-Nucleo\Examples\GPIO\GPIO_IOToggle注意CubeIDE 导入时可能会提示找不到某些路径因为例程默认引用的是相对路径。如果报错右键工程 - Properties - C/C General - Paths and Symbols检查 Includes 里是否指向了你解压的固件包目录。通常 CubeIDE 会自动识别但如果你移动过文件夹就需要手动修正。4.3 时钟配置与下载验证例程里通常已经配好了时钟树。以 F103RB-Nucleo 为例默认使用 8MHz 外部晶振PLL 倍频到 72MHz。如果你用的是自己画的板子晶振频率不同需要在main.c里的SystemClock_Config函数中修改。下载程序前确认调试器选的是 ST-Link接口是 SWD。点击 Run如果板子上的 LED 开始闪烁说明整个环境从固件包到工具链全部打通。4.4 从例程迁移到自己的工程例程跑通后你可以把Drivers目录整个拷贝到自己的工程目录下然后在 CubeIDE 里新建工程把需要的源文件链接进来。我一般会保留例程的目录结构只改Core/Src和Core/Inc下的用户代码。这样以后升级固件包时只需要替换Drivers目录用户代码不受影响。5. 避坑与排查STM32Cube_FW_F1_V1.8.0 安装过程中最容易踩的五个坑5.1 现象编译报错 “stm32f1xx_hal.h: No such file or directory”原因Include Paths 里没有添加 HAL 库的 Inc 目录或者路径写错了一个层级。很多人会把Drivers/STM32F1xx_HAL_Driver直接加进去但实际需要的是它下面的Inc子目录。解决检查 Keil 的 Include Paths 或 CubeIDE 的 Includes 设置确保路径精确到Inc文件夹。路径中不要有中文和空格。5.2 现象程序下载后不运行调试器停在 HardFault原因启动文件选错了。比如芯片是 F103C8启动文件却选了startup_stm32f103xe.s中断向量表偏移不对。解决根据芯片型号重新选择启动文件。F103C8 对应startup_stm32f103xb.sF103ZE 对应startup_stm32f103xe.s。同时检查STM32F103xB宏是否和启动文件匹配。5.3 现象串口打印乱码原因HSE_VALUE宏和实际晶振频率不一致导致系统时钟和波特率计算错误。比如板子是 12MHz 晶振但stm32f1xx_hal_conf.h里还是默认的 8000000。解决打开stm32f1xx_hal_conf.h找到#define HSE_VALUE改成实际晶振频率。同时检查SystemClock_Config里的 PLL 倍频参数是否匹配。5.4 现象Keil 编译时提示 “cannot open source input file core_cm3.h”原因CMSIS 内核头文件路径没加或者加的是旧版 CMSIS 路径。V1.8.0 固件包里的 CMSIS 版本和旧工程不兼容。解决在 Include Paths 里添加Drivers/CMSIS/Include和Drivers/CMSIS/Device/ST/STM32F1xx/Include。不要从其他工程拷贝core_cm3.h直接用固件包里的。5.5 现象CubeMX 生成的代码和手动添加的 HAL 库冲突原因CubeMX 会自己管理固件包版本如果你手动在工程里加了 V1.8.0 的源文件而 CubeMX 配置里指向的是另一个版本编译时会出现重复定义或 API 不匹配。解决统一版本。要么全部用 CubeMX 管理的固件包要么全部手动添加。我一般会在 CubeMX 的 Project Manager 里把固件包版本锁定为 V1.8.0然后让 CubeMX 生成代码不再手动拷贝 HAL 源文件。6. 装完怎么验证用 GPIO 翻转和串口打印确认环境真正跑通环境装完编译通过不代表真的能用。我习惯用两个小测试来验证一个是 GPIO 翻转一个是串口打印。这两个跑通基本说明 HAL 库、时钟、中断、外设初始化都没问题。先写一个最简单的 GPIO 测试。假设你的板子上有一个 LED 接在 PC13代码如下#include stm32f1xx_hal.h int main(void) { HAL_Init(); // 初始化 HAL 库 __HAL_RCC_GPIOC_CLK_ENABLE(); // 使能 GPIOC 时钟 GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin GPIO_PIN_13; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, GPIO_InitStruct); while (1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(500); // 500ms 翻转一次 } }这段代码里HAL_Init()会配置 SysTick 和中断优先级__HAL_RCC_GPIOC_CLK_ENABLE()是必须的否则 GPIO 不工作。HAL_Delay依赖 SysTick 中断如果前面HAL_Init没调这里会死等。编译下载后LED 应该以 1Hz 频率闪烁。如果不闪先检查时钟配置再检查 GPIO 引脚是否接对。接着验证串口。用 USART1PA9 为 TXPA10 为 RX波特率 115200#include stm32f1xx_hal.h UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_USART1_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); // 配置系统时钟为 72MHz MX_USART1_UART_Init(); uint8_t msg[] STM32Cube_FW_F1_V1.8.0 test\r\n; HAL_UART_Transmit(huart1, msg, sizeof(msg)-1, 1000); while (1) {} } static void MX_USART1_UART_Init(void) { huart1.Instance USART1; huart1.Init.BaudRate 115200; huart1.Init.WordLength UART_WORDLENGTH_8B; huart1.Init.StopBits UART_STOPBITS_1; huart1.Init.Parity UART_PARITY_NONE; huart1.Init.Mode UART_MODE_TX_RX; huart1.Init.HwFlowCtl UART_HWCONTROL_NONE; huart1.Init.OverSampling UART_OVERSAMPLING_16; HAL_UART_Init(huart1); }SystemClock_Config函数需要根据你的晶振频率配置 PLL这里不展开CubeMX 生成的代码可以直接用。串口助手里应该能看到那行字符串。如果乱码回头检查HSE_VALUE和波特率。如果收不到检查 PA9 是否接对以及 USART1 时钟是否使能。这两个测试都通过说明 STM32Cube_FW_F1_V1.8.0 的环境已经完整落地。从那以后我每次装完固件包都会先跑一遍 GPIO 翻转和串口打印确认无误再开始写业务代码。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站