给电脑装上优雅的开源STM32开发环境

准备工作

下载 Visual Studio Code

Visual Studio Code 下载地址

下载 arm-none-eabi-gcc

这个的话下.exe和.zip的区别不大,都能跑,将.zip解压到哪,哪里就是安装路径

ARM GCC官网。挑最新版本下

下载 MSYS2

清华大学软件源

下载 OpenOCD

OpenOCD官网,挑最新版本下

下载 STM32CubeMX

自己去ST官网找找就行了,这里不贴地址了 算了,还是把地址贴上吧

安装流程

软件安装

这几个软件(除了OpenOCD只能解压)都是图形化界面安装,这里就不多说了。装在哪里问题不大,但是要注意路径中一定不能包含中文和空格,而且一定要记住安装路径(这句话的意思是指:不要自己都不知道软件装在哪里,咱毕竟是跟电脑打交道的,文件夹啥的自己想办法组织一下,就别老是只有全盘搜索才能搜出来文件)

OpenOCD直接将下载的压缩包解压到一个地方就行,解压的目的文件夹就是安装文件夹。

比如这个路径就是不包含中文的:

在这里插入图片描述

这个路径就是包含中文的:

在这里插入图片描述

环境配置

设置环境变量

安装完这些个软件之后,在“此电脑”的空白区域右键单击,就会出现这么一个小菜单:

在这里插入图片描述

选择最后一项“属性”,进入这么个窗口:

在这里插入图片描述

左键单击一下“高级系统设置”,继续进入这个窗口:

在这里插入图片描述

点击“环境变量”,进入这个窗口:

在这里插入图片描述

在“系统变量”中找到“PATH”,并双击一下:

在这里插入图片描述

就会进入这个界面:

在这里插入图片描述

在这个界面中,点击“新建”就会增加一项。现在检查一下这个列表里面有没有以下几项,如果没有的话就手动添加一下:

{arm-none-eabi-gcc的程序文件夹}\bin
{MSYS2安装路径}\usr\bin
{OpenOCD的程序文件夹}\bin

arm-none-eabi-gcc的程序文件夹长这个样子:

在这里插入图片描述

MSYS2安装路径长这个样子:

在这里插入图片描述

OpenOCD的程序文件夹长这个样子:

在这里插入图片描述

添加之前先看看要添加的路径是不是真的存在,有可能OpenOCD在解压的时候会多出来一层文件夹,需要注意一下。

配置PACMAN的源

现在打开以下目录:

{MSYS2安装路径}\etc\pacman.d

目录里面有几个文件:

在这里插入图片描述

将这几个文件全部打开:

在这里插入图片描述

先找到mirrorlist.clang32文件的这一行:

Server = https://mirrors.ustc.edu.cn/msys2/mingw/clang32/

然后把它复制到文件的最顶上。

其他几个文件都找到这个网址所在的行,并且把这行复制到最顶上即可。具体过程这里不再赘述。

这样是为了将mirrors.ustc.edu.cn作为Pacman下载安装程序的源地址。在Linux系统中,通常会存在一个“软件包管理器”,这个管理器的功能是在特定的地址(URL)下载软件的安装包并且安装这个软件。Pacman是Arch Linux的软件包管理器,这里虽然已经被移植到Windows上了,但是还保留着原有的配置方式。

安装MinGW-GCC

现在右键单击屏幕左下角的Windows徽标,选择“终端管理员”(Win11)或者“PowerShell(管理员)”(Win10),就会出来一个黑框框:

在这里插入图片描述

输入以下命令:

pacman -Sy
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
pacman -S make

第二条指令不用管它会问你什么,遇到问题按回车就行。

使用说明

从CubeMX生成Makefile工程

最优雅的工程,仅仅需要一处更改:

在这里插入图片描述

别的操作都一样。

然后用vscode打开这个目录即可:

在这里插入图片描述

编译并下载

先贴出祖传脚本:

# build.bat,把这段内容复制一下,放在ST工程的根目录,跟Makefile放一起
make -j64
openocd.exe ^
-f interface/cmsis-dap.cfg ^
-f target-st/stm32h7x.cfg ^
-c "init" ^
-c "transport select swd" ^
-c "halt" ^
-c "flash erase_sector 0 0 last" ^
-c "flash write_image ./build/{你的STM32CubeMX工程名字}.hex" ^
-c "reset" ^
-c "shutdown"

这个脚本是用来下载H7系列的STM32单片机的。如果要下载别的单片机,可以到下面这个目录找:

{OpenOCD的程序文件夹}\share\openocd\scripts\target-st

找到能对应得上你的单片机的文件,然后把stm32h7x.cfg换成相应的文件名称即可。例如要烧录STM32F103,那就改成stm32f1x.cfg

如果要下载,可以直接在vscode打开一个终端,然后在终端命令行里面输入这个文件的文件名即可(令人感觉很有格调)。当然也可以在文件资源管理器鼠标双击这个.bat文件(可能令人感觉没有格调)。

在这里插入图片描述

PS:我是用Linux的,所以写的是.sh后缀;Windows要写.bat后缀。

在这里插入图片描述

在命令跑完之后一定要看一下是否真正编译成功了,以及OpenOCD有没有报错。有一些下载器对OpenOCD的支持不好,容易出现烧两次才烧得进去的情况。

答疑解惑

怎么看编译成没成功?

先输入以下指令进行编译:

make j16

如果系统提示没有make这个程序,那就用以下指令安装make:

pacman -S make

一般来说,编译完成之后会有一个列表汇总:

在这里插入图片描述

如果没编译成功的话,GCC会有红色的ERROR,是不会出现这个汇总的。

如果出现“make: *** No rule to make target ‘build/main.o’, needed by ‘build/f4.elf’. Stop.”怎么办?

把{arm-none-eabi-gcc安装目录}/usr/bin/make.exe删除即可。

怎么看OpenOCD是不是真把程序烧录进去了?

这种情况就是电脑跟调试器没连好:

怎么写自己的代码源文件?

按照我的习惯来说,我会在工程根目录建立一个文件夹,然后将一个外设的头文件和源文件放到这一个文件夹中,具体参考我的GitHub工程:AD9910驱动工程的文件组织结构

“工程根目录”是指makefile文件所在的目录。

如果我自己写了一份C代码,在Makefile中要怎么添加?

在makefile里面修改两处地方:C_SOURCESC_INCLUDES

C_SOURCES里面添加你.c文件的相对路径,在C_INCLUDES中添加.h文件的所在目录的相对路径(需要加-I前缀)。

# C sources
C_SOURCES =  \
......
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart_ex.c \
wave_generator/wave_generator.c
# C includes
C_INCLUDES =  \
......
-IDrivers/CMSIS/DSP/Include \
-Iwave_generator

没了断点,怎么调试?

C语言提供了优雅的printf函数,只需要开启USART1,并在这里加上一点代码:

// main.c
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int _write(int file, char *ptr, int len)
{
  HAL_UART_Transmit(&hlpuart1, (const uint8_t *)ptr, len, HAL_MAX_DELAY);

  int DataIdx;

  for (DataIdx = 0; DataIdx < len; DataIdx++)
  {
    printtft_putc(*ptr++);
  }

  return len;
}
/* USER CODE END 0 */

printf不无道理。一般来说,单片机调试都要先把单片机停下来,然后进行寄存器和内存的读写。这样一来,就破坏了单片机原来的运行流,不利于一些系统性问题的发现。

在makefile中找到LDFLAGS,将选项中那个的-specs=nano.specs删除后启用完全特性的printf,可以用printf函数的%f功能打印浮点数。

做嵌入式的,还是要保留一部分单片机原有的运行情况的。

进阶应用

Makefile添加STM的DSP库

C_INCLUDES中添加-IDrivers/CMSIS/DSP/Include

LIBS(这个变量在文件靠后的位置)中添加-larm_cortexM7lfdp_math

LIBDIR(这个变量就在LIBS的下一行)中添加-LDrivers/CMSIS/DSP/Lib/GCC

添加完之后大概是这样的,可能会有一些不一样(例如-specs=nano.specs可能已经被删除),但是基本都是一样的:

# libraries
LIBS = -lc -lm -lnosys -larm_cortexM7lfdp_math
LIBDIR = -LDrivers/CMSIS/DSP/Lib/GCC
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections

Makefile添加最新的CMSIS-DSP库

答疑贡献名单

黄银河

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值