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

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(参考文件夹目录自行完成添加)
    参考设置:
  • .\Core\Inc
    .\Drivers\STM32F1xx_HAL_Driver\Inc
    .\Drivers\STM32F1xx_HAL_Driver\Inc\Legacy
    .\Drivers\CMSIS\Device\ST\STM32F1xx\Include;
    .\Drivers\CMSIS\Include;

    如果使用了FreeTROS:

    .\Middlewares\Third_Party\FreeRTOS\Source\include
    .\Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2
    .\Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_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灯在闪烁。

    完整的工程下载

    我这里提供了完整的工程。点这里跳转 Github 链接
    由于工具链体积较大,请移步到ARM官网下载

    作者:Oβすヌすヌすヌす

    物联沃分享整理
    物联沃-IOTWORD物联网 » Keil环境下配置GCC编译器以开发STM32 C语言项目:探讨C语言特性及第23条指南

    发表回复