单片机
返回首页

Keil环境下配置GCC编译器以开发STM32 C语言项目:探讨C语言特性及第23条指南

2025-10-11 来源:cnblogs

Keil 配置 GCC 编译器用于 STM32 和 C++23 特性

  • Keil 配置 GCC 编译器


  • 安装工具链 Arm GNU Toolchain arm-none-eabi

  • 创建Keil工程


  • 前置步骤:获取依赖代码


  • 方式1 使用STM32CubeMX辅助生成

  • 方式2 Github

  • 创建Keil工程

  • 管理工程


  • 添加分组Core/Src

  • 添加分组Core/Startup

  • 添加分组Drivers/STM32F1xx_HAL_Driver

  • 设置GCC工具链(关键)

  • 配置编译目标(重要)



  • 配置编译生成的文件目录

  • 配置C、C++选项

  • 配置汇编选项

  • 配置链接选项

  • 添加函数

  • 完成创建


  • 测试工程


  • 添加LED灯闪烁代码

  • 设置调试器

  • 完整的工程下载

  • Keil 配置 GCC 编译器

    我这里使用STM32F103C8T6演示
    如果你想复现本文过程,你需要准备以下清单:

  • Keil MDK (必需)

  • 芯片支持包 Keil.STM32F1xx_DFP.2.4.0.pack (必需,请忽略版本,不要太旧即可)

  • STM32CubeMX(非必需)

  • STM32F103C8T6核心板(非必需)

  • 任意烧录器,如DAPLink(非必需)

  • 安装工具链 Arm GNU Toolchain arm-none-eabi

    下载地址:

    https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

  • 注意:下载页面会提供非常多的选项给你,这里一定不要选错,你需要注意的点:

  • 1.选择Windows 不要选错其它操作系统的类型,除非你的Keil可以在Mac或者Linux上运行

  • 2.选择(mingw-w64-x86_64) 而不是 (mingw-w64-i686),这里是你电脑的CPU架构类型,选64位可以更好利用CPU资源,提高编译速度

  • 3.选择AArch32,因为STM32是32位Cortex M架构

  • 我这里选择可执行文件exe安装,当然你也可以选择下载压缩包zip直接解压到你想要的目录

    创建Keil工程

    前置步骤:获取依赖代码

    我这里提供两种方式

    方式1 使用STM32CubeMX辅助生成

    配置好时钟、烧录方式以及你所需的功能之后
    选择 STM32CubeIDE 或者 CMake 生成代码

    你会问,Keil工程为什么不直接选MDK-ARM?
    因为我们需要汇编启动文件startup_stm32f103c8tx.s以及链接脚本STM32F103C8TX_FLASH.ld

    方式2 Github

    Github获取HAL库代码

    https://github.com/STMicroelectronics/stm32f1xx-hal-driver

    创建Keil工程

  • 步骤一 在Keil软件中创建新工程

  • 步骤二 命名后保存到前置步骤中,你放HAL库代码的地方

  • 步骤三 选择芯片

    步骤四 这个窗口先忽略,点OK关掉它

  • 管理工程

    添加分组Core/Src
  • 这里按照文件夹中的代码来添加分组即可

  • 这里双击1把分组改名为Core/Src

    选择对应的文件,按Ctrl+A全选,然后Add添加就可以了

  • 添加分组Core/Startup

    启动汇编
    这里记得选择文件类型



    添加分组Drivers/STM32F1xx_HAL_Driver

    这里和分组Core/Src的添加步骤一致,进入对应的文件目录后按Ctrl+A全选添加即可

    设置GCC工具链(关键)
  • 这里第三步选择我们之前安装的GCC工具链目录(arm-none-eabi)

  • 配置编译目标(重要)

    配置编译生成的文件目录

    配置C、C++选项

    从上到下分别添加

  • 预定义宏 Defines

  • USE_HAL_DRIVER,STM32F103xB

  • 头文件包含路径 Include Path(参考文件夹目录自行完成添加)
    参考设置:

  • .CoreInc
    .DriversSTM32F1xx_HAL_DriverInc
    .DriversSTM32F1xx_HAL_DriverIncLegacy
    .DriversCMSISDeviceSTSTM32F1xxInclude;
    .DriversCMSISInclude;

    如果使用了FreeTROS:

    .MiddlewaresThird_PartyFreeRTOSSourceinclude
    .Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2
    .MiddlewaresThird_PartyFreeRTOSSourceportableGCCARM_CM3

  • 编译器选项 Misc Contros

  • -mcpu=cortex-m3 -mthumb -mthumb-interwork -ffunction-sections -fdata-sections -fno-common -fmessage-length=0 -specs=nosys.specs -Wl,-nostartfiles

    配置汇编选项

  • 传递给汇编编译器的选项 Misc Contros

  • -mcpu=cortex-m3 -mthumb -mthumb-interwork

    配置链接选项

  • 选择链接脚本

  • .STM32F103C8TX_FLASH.ld

    . 表示当前目录,即 与Keil工程文件处于同一目录下的 STM32F103C8TX_FLASH.ld 文件

  • 传递给链接器的选项

  • -Wl,-gc-sections,–print-memory-usage

    添加函数

    在任意C文件中添加以下函数:

    void _init(void) {}

    如果是C++文件,需要增加 extern “C” 修饰:

    extern “C” void _init(void) {}

    完成创建

    恭喜你,到此Keil项目已创建完毕,此时你编译会得到下图结果:

    测试工程

    添加LED灯闪烁代码

    在main函数中添加以下代码测试板载LED灯能否工作

      GPIO_InitTypeDef GPIO_InitStruct = {0};
      __HAL_RCC_GPIOC_CLK_ENABLE();
      GPIO_InitStruct.Pin = GPIO_PIN_13;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
      HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
      while(1) (
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        HAL_Delay(200);
      )
    设置调试器

    我这里选择DAPLink,根据你手上的调试工具选择即可

    编译并烧录后,可以看到板载LED灯在闪烁。


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外遥控音量控制

  • LM317过压保护

  • 12V转110V/220V 500W逆变器

  • DS1669数字电位器

    相关电子头条文章