准备工作
下载 Visual Studio Code
下载 arm-none-eabi-gcc
这个的话下.exe和.zip的区别不大,都能跑,将.zip解压到哪,哪里就是安装路径
下载 MSYS2
下载 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_SOURCES
和C_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库
答疑贡献名单
黄银河