本文参考以下三篇博客:
Mac配置STM32开发环境;
stm32f407zgt6引脚功能定义;
HAL库开发OLED;
♪³ 下载软件和工具
1、STM32CubeMX;
前往ST官网下载安装即可:
STM32CubeMX下载
2、VS Code;
浏览器搜索安装即可;
3、arm-none-eabi-gcc;
前往此github仓库:
Xpack版的交叉编译器
下载后得到名如xpack-arm-none-eabi-gcc-14.2.1-1.1-darwin-arm64.tar.gz的压缩包,将其移动到Library文件夹中解压:
zsh1mkdir -p ~/Library/xPacks/arm-none-eabi-gcc2cd ~/Library/xPacks/arm-none-eabi-gcc34tar xvf ~/Downloads/xpack-arm-none-eabi-gcc-14.2.1-1.1-darwin-arm64.tar.gz56# 若要把此目录设为已读以保护文件不被修改,可以执行以下命令7chmod -R -w xpack-arm-none-eabi-gcc-14.2.1-1.18
之后修改环境变量:
zsh1vim ~/.zshrc2# 在最底下添加以下内容3export PATH="$HOME/Library/xPacks/arm-none-eabi-gcc/xpack-arm-none-eabi-gcc-14.2.1-1.1/bin:$PATH"4# 然后:wq保存退出后source一下5source ~/.zshrc6
之后输入命令检查,当前链接的交叉编译器是Library目录下的
zsh1which arm-none-eabi-gcc2arm-none-eabi-gcc --version3echo | arm-none-eabi-gcc -xc -E -v -4
如果弹出“Apple无法验证arm-none-eabi-gcc是否包含可能危害Mac安全...”的弹窗,不要点击“移到废纸篓”,点击左边的“完成”,然后在命令行输入以下内容(注意其中的目录需根据之前的安装路径决定,因为可能因时间变化,你下载的默认版本会不同):
zsh1TOOLCHAIN=~/Library/xPacks/arm-none-eabi-gcc/xpack-arm-none-eabi-gcc-14.2.1-1.123# 对整个工具链目录去掉隔离标记4xattr -r -d com.apple.quarantine "$TOOLCHAIN"5
之后再执行arm-none-eabi-gcc --version就不会弹出验证弹窗了
4、Open-OCD;
直接命令行执行即可:
zsh1brew install open-ocd2
♪³ VS Code插件安装(可选)
在VS Code中搜索并安装以下插件即可
1、Cortex-Debug
2、C/C++
3、C/C++ Extension Pack
♪³ CubeMX项目配置
1.打开CubeMX,点击File → New Project来新建项目:

2.在打开的项目中选择自己所用的板子,这里以STM32F407ZGT6为例子

3.依次按图中箭头所示点击,来开启外部晶振高速时钟

4.再开启I2C,因为本文使用的OLED是I2C方式驱动的

5.之后切换到时钟页面,将此处频率改为168Mhz,CubeMX会自动修改之后的分频(不得不说用HAL开发,能用CubeMX配置是真方便,以前用标准库,代码一行一行配置,如果不熟悉很容易出错)

6.之后切换到项目管理页面,项目名称可以随便取,Toolchain这里记得要选Makefile

7.切换到第二个选项,勾上这个,之后点击生成代码即可完成配置,之后如果不启用新的外设,都可以不用再打开CubeMX

♪³ Makefile修改及OpenOCD配置
之后在终端打开项目文件夹,如果前面都配置完了,是可以直接make编译的,并且能在build目录下得到.elf文件
直接输入:
zsh1make2
如果最后显示这些内容,那说明之前的环境都没有配错
zsh1_FLASH.ld -lc -lm -lnosys -Wl,-Map=build/OLED.map,--cref -Wl,--gc-sections -o build/OLED.elf2arm-none-eabi-size build/OLED.elf3 text data bss dec hex filename4 4912 12 1652 6576 19b0 build/OLED.elf5arm-none-eabi-objcopy -O ihex build/OLED.elf build/OLED.hex6arm-none-eabi-objcopy -O binary -S build/OLED.elf build/OLED.bin7
之后进行OpenOCD的配置,在项目根目录下创建xxx.cfg,OpenOCD就是根据这个文件的规则进行烧录的,本文用的是STLink,可以参考以下配置,至于这些配置的含义,可以询问AI
cfg1# stm32f407zgt6.cfg(文件名)23source [find interface/stlink.cfg]4transport select hla_swd5adapter speed 400067set CHIPNAME stm32f407zgt68source [find target/stm32f4x.cfg]9reset_config srst_only srst_nogate1011init12reset halt13
可以在Makefile中添加以下内容,这样就手动在命令行输入OpenOCD的命令了,也就是在Makefile这个文件的最后,EOF标签之前输入
makefile1#######################################2# flashing3#######################################4flash:5 make6 openocd -f stm32f407zgt6.cfg -c "program build/car.elf verify reset exit"7
这样之后烧录的时候,直接输入下面这个命令就行了
zsh1make flash2
在烧录后如果显示下面这些,特别是看到Programming Finished,那就说明没问题,程序已经烧录进去了,不用在意Info的信息,那个可能是cfg那个文件的频率设置的有问题,OpenOCD在识别了我们的芯片后自动改好了
zsh1** Programming Started **2Info : device id = 0x100f64133Info : flash size = 1024 KiB4** Programming Finished **5** Verify Started **6** Verified OK **7** Resetting Target **8Info : Unable to match requested speed 2000 kHz, using 1800 kHz9Info : Unable to match requested speed 2000 kHz, using 1800 kHz10shutdown command invoked11
♪³ 示例代码编写
这部分我直接照搬了别人的代码,参考博客的链接在文章开头已经给出。
在查阅了芯片手册后(实际上本文是直接搜了别人的博客看的),STM32F407ZGTx的引脚定义中,PB6对应了I2C的SCL,PB7对应了SDA,将对应的线连好即可。
然后在根目录创建OLED文件夹,根据那篇博客创建并编写好oled.c、oled.h、font.h即可,我的目录结构如下,可供参考
zsh1├── OLED2│ ├── Inc3│ │ ├── font.h4│ │ └── oled.h5│ └── oled.c6
然后要在Makefile文件中,把自己编写的文件包含进去,
源文件就在这里添加:
makefile1######################################2# source3######################################4# C sources5C_SOURCES = \6OLED/oled.c \7Core/Src/main.c \8Core/Src/stm32f4xx_it.c \9...10
头文件就在这部分添加:
makefile1# C includes2C_INCLUDES = \3-IOLED/Inc \4-ICore/Inc \5-IDrivers/STM32F4xx_HAL_Driver/Inc \6...7
最后记得在主程序Core/Src/main.c中修改代码时,要在类似User Code这类标签之间修改,否则之后要添加新的外设,使用CubeMX重新生成代码时,会将自己编写的代码删除
c1/* USER CODE BEGIN 2 */2OLED_Init();3OLED_Clear();4/* USER CODE END 2 */56...78/* Infinite loop */9/* USER CODE BEGIN WHILE */10while (1)11{12 OLED_ShowString(10,2,"Hello World",8);13/* USER CODE END WHILE */14...15
最后在命令行中,输入make进行编译,再输入make flash进行烧录即可,最终效果如下


