ARM 嵌入式基于 STM32CUBEMX 开发指南


本文基于 MACOS + STM32CUBEIDE + STM32CUBEMX 下攥写,立志打造MAC操作系统嵌入式开发环境。

调试接口设置说明

需要先使用 CubeMX 进行配置调试接口才可以使用CubeIDE的下载功能
解决报错:
  • Serial wire 即 SWD 调试下载模式
  • JTAG4/5 即 JTAG 边缘检测调试下载模式
  • Trace Asynchronous Sw 据说是自动配置调试可以



参考资料: https://blog.csdn.net/qq_38288618/article/details/98640223

ST-Link 更新报错

st-link is not in the DFU mode
安装stlink utility:

官网下载:https://www.st.com/content/st_com/zh.html

在ST-LINK utility中连接芯片,提示仿真器版本过低,点击更新,报错提示:“ST LINK is not in the DFU mode plesse restart it”
操作步骤
1、拔掉stlink
2、插上stlink(需要确保stlink没有连上MCU)
3、不要搞别的,直接点击ST-LINK->Firmware update->device connect

STM32F103C8T6 核心版配置样例

配置RCC使用外部时钟源

配置错误会导致程序无法正常运行,GPIO高低电平异常。
  • HSE(High Speed Clock) < 晶振(板载8M)
  • LSE(Low Speed Clock) < 内部时钟

PS: 若未使用RTC时钟,则不要陪着RTC设置,否则会致使运行异常。

参考资料: https://blog.csdn.net/m0_73659470/article/details/127790855

完整项目创建案例

已亲自踩坑,查阅资料无数,以下是正确示范参考
  1. STM32CubeMX 生成代码模版 -> 工具链/IDE(Toolchain/IDE): makefile
  2. Vscode + Embedded IDE创建工程 生成空模版项目:路径选择1处生成路径
  3. 添加项目资源: 即对应的文件及文件夹,可以将整个目录加入再排出或者对照 makefile 文件增加
  4. 手动添加 startup_stm32XXXXX.s 文件进项目资源,推荐直接将其复制到 CMSIS 层
  5. 芯片支持包:当使用GCC编译器不用配置。如果是ARMCC编译器,可以从ARM官网中下载pack支持包,加载到项目;同时也可以在线加载芯片支持包。
  6. 构建配置 -> 选择链接脚本路径(.s 文件) -> 选择CPU架构 -> 按如下进行配置编译器选项

    参考 makefile 进行设置,大致同 MDK-Arm; 或者参考项目模版进行配置
    1.CPU类型根据芯片选择对应内核
    2.链接脚本路径选择刚刚拷贝的STM32L475VETx_FLASH.ld
    3.目录参考Makefile的C_INCLUDES = \
    4.预定义参考Makefile的C_DEFS = \
    • 编译器: GNU Arm Embedded GCC
    • 附加编译选项: C/C++/汇编均为 -ffunction-sections -fdata-sections
    • 附加链接器选项: --specs=nosys.specs --specs=nano.specs -Wl,--gc-sections
    • 附加链接库选项: -lm
    • 完整配置模版见本节末
  7. 预处理宏定义:参考 makefile 进行配置即可,注意删掉参数 -D (定义宏)
  8. 项目属性:添加项目所有引用的 .h 文件所在目录;注: EIDE 中不能使用 ; 进行一行分割多个路径,测试MAC下报错。
  9. 烧录配置:

    • 开源项目 st-link https://github.com/stlink-org/stlink/

      • 可以搭配自写 shell 命令使用,好像有GUI版本,未尝试
      • Mac 一键安装: brew install stlink
      • 常用命令:
      • st-info --probe 查st-link设备信息;
      • st-flash --format ihex write Debug/iSuroy.hex 写hex;
      • st-flash erase 擦出'
    • 开源项目 PyOCD 推荐

      • 推荐使用: pip3 install pyOCD 终端运行安装即可
      • 测试使用: STM32F103C8T6、ST-Link+SWD 可以使用,支持一键下载调试
      • 烧录配置: 目标芯片若没有则选相近
      • 报错处理: C flash program page failure (address 0x08000000; result code 0x1) [__main__]

        • 先使用烧写工具先擦出一次再用该程序烧写
        • 可以使用 st-flash 进行烧写或者擦写一次之后再使用pyocd
        • 正解如下

          • 配置pyocd调试器: 配置参考附录
          • 1、先配置其他选项,点击后,需要再pyocd配置文件中,添加对应的pack路径
          • 2、再配置对应的芯片信号,只有添加了pack路径后,芯片型号才能正确选择
    • Stm32Programer 安装使用即可
    • OpenOCD 能力有限,折腾许久无果,希望有大佬的话可以带带我~

  10. 调试配置:

    Cortex-Debug + PyOCD 搞定

GCC输出printf重定向

挖坑待填

构建配置 json 参数设置

直接打开配置,复制粘贴保存,刷新项目即可。
{
 "version": 4,
 "beforeBuildTasks": [],
 "afterBuildTasks": [],
 "global": {
     "$float-abi-type": "softfp",
     "output-debug-info": "enable",
     "misc-control": "-ffunction-sections -fdata-sections"
 },
 "c/cpp-compiler": {
     "language-c": "c11",
     "language-cpp": "c++14",
     "optimization": "level-debug",
     "warnings": "all-warnings",
     "C_FLAGS": "-ffunction-sections -fdata-sections",
     "CXX_FLAGS": "-ffunction-sections -fdata-sections"
 },
 "asm-compiler": {
     "ASM_FLAGS": "-ffunction-sections -fdata-sections"
 },
 "linker": {
     "LD_FLAGS": "--specs=nosys.specs --specs=nano.specs -Wl,--gc-sections",
     "output-format": "elf",
     "LIB_FLAGS": "-lm"
 }
}

下载配置 Pyocd

找不到芯片型号就在于没有指定Pack路径;芯片型号正确之后,下载不需要先进行手动擦出。
pack:
    - pack/Keil.STM32F1xx_DFP.2.3.0.pack

PS: 编译正常,程序跑不了,原因就在于4,由于 cubeMX 生成的 startup_stm32XXXXX.s文件路径在项目跟路径,未加入到项目资源中,编译缺少内容;

实用技巧

makefile + GCC 工程与 Keil 互转

转换环境: Vscode + Embedded IDE

主要是在于 startup_stm32XXXXX.s 文件的问题,该文件即 MCU 的分区表信息及编译工具链相应信息;
Keil 所用startup_stm32f10x_hd.S是专门用与keil上的,不能用于gcc,二者有所不同;目前看来的话注释规范不同,语法没有注意:) makefile 导出的 .s 文件的注释规范类似于 C 语言的

  1. 将 CubeMX 或者 Keil 导出的 MDK-ARM 项目中导入到 EMbedded IDE
  2. 实用 CubeMX 生成一个对应芯片的 makefile 工程,将其中的 .s 文件和 makefile 文件添加到 1处项目中
  3. 屏蔽掉项目资源的引用,主要屏蔽冲突的 startup_stm32XXXXX.s 文件,注意不要忘记了手动添加 .s 项目资源文件

另解如下:

  • Github搜索: GCC + 芯片型号 或者 makefile + 芯片型号
  • 或直接使用 Embedded IDE 进行生成对应 MCU 模版,再进行程序移植。

补充:如何判断是否是编译配置问题?

  1. 直接尝试进入项目路径在终端中运行: make 若编译出来文件正确烧写,而 embedded IDE 编译出来的文件烧写运行异常,则可能是编译配置问题;
  2. 比较两边编译hex/bin文件大小,一般异常的文件很小只有几KB。

推荐学习资料

讲的非常好,力推!!!

声明:Grows towards sunlight |版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - ARM 嵌入式基于 STM32CUBEMX 开发指南


Grows towards sunlight and Carpe Diem