在linux下开发stm32体验及心得(经验贴)
目录
二、arch Linux的安装,及其工具链、编译选项、Makefile的介绍
一、前言
近半年来,随着windows10的更新,在windows上开发stm32越发感觉不舒服(指windows平台,当然keill也不舒服),每每感觉windows的弹窗、广告、浏览器等问题愈发严重、keill的授权也始终萦绕在心头,多次想切换到linux下试一试,但每次切换过去不到一周又切换到windows系统。在这中间也是试了不少linux发行版。在这样不断的切换中逐渐厌烦(鬼知道我在windows下安装了多少遍驱动,在Linux下重装了多少工具。。。。。泪目),最选择了arch linux(无他,只是听说很难,不好安装,就一头沉进去了)。为了能继续在野生钢铁侠的路上越走越远,又开始在Linux上搭建开发平台,搞调试、串口等工具也是一阵摸索,为了各位同仁再遇到一样的情况下快速的上手Linux下stm32开发,遂在此抛砖引玉。
二、arch Linux的安装,及其工具链、编译选项、Makefile的介绍
(一)archLinux的安装
archLinux的安装我强烈建议看这一篇文档:
这一篇包含了基本系统的安装,驱动的安装,桌面环境的安装,以及常用工具的安装,而且更新很及时。
1.常用工具的安装
stm32 GCC编译器:
sudo pacman -S arm-none-eabi-gcc arm-none-eabi-gdb arm-none-eabi-newlib #pacman 是aechLinux的包管理器 -S(大写)选项是 安装或者升级单个软件包,或者一列软件包(包含依赖包)
Vscode 及其插件的安装:
安装前请确保您的电脑上有yay包管理器
yay -S visual-studio-code-bin #微软官方版本,专有软件
具体vscode版本可以看arch Linux的wiki:
在vscode中安装扩展工具如下
C/C++
Cortex-Debug
GNU Linker Map files
(二)建立工程文件
建立工程(我的目录如下)
├── Build
│ ├── main.bin
│ ├── main.d
│ ├── main.elf
│ ├── main.hex
│ ├── main.o
│ ├── misc.d
│ ├── misc.o
│ ├── spi.d
│ ├── spi.o
│ ├── startup_stm32f407xx.o
│ ├── stm32f4xx_gpio.d
│ ├── stm32f4xx_gpio.o
│ ├── stm32f4xx_rcc.d
│ ├── stm32f4xx_rcc.o
│ ├── stm32f4xx_spi.d
│ ├── stm32f4xx_spi.o
│ ├── stm32f4xx_usart.d
│ ├── stm32f4xx_usart.o
│ ├── system_stm32f4xx.d
│ ├── system_stm32f4xx.o
│ ├── usart.d
│ └── usart.o
├── CMSIS
│ ├── Inc
│ │ ├── core_cm4.h
│ │ ├── core_cmFunc.h
│ │ ├── core_cmInstr.h
│ │ ├── core_cmSimd.h
│ │ ├── stm32f4xx.h
│ │ └── system_stm32f4xx.h
│ └── Src
│ └── system_stm32f4xx.c
├── Dev
│ ├── inc
│ │ ├── misc.h
│ │ ├── stm32f4xx_adc.h
│ │ ├── stm32f4xx_can.h
│ │ ├── stm32f4xx_cec.h
│ │ ├── stm32f4xx_crc.h
│ │ ├── stm32f4xx_cryp.h
│ │ ├── stm32f4xx_dac.h
│ │ ├── stm32f4xx_dbgmcu.h
│ │ ├── stm32f4xx_dcmi.h
│ │ ├── stm32f4xx_dfsdm.h
│ │ ├── stm32f4xx_dma2d.h
│ │ ├── stm32f4xx_dma.h
│ │ ├── stm32f4xx_dsi.h
│ │ ├── stm32f4xx_exti.h
│ │ ├── stm32f4xx_flash.h
│ │ ├── stm32f4xx_flash_ramfunc.h
│ │ ├── stm32f4xx_fmc.h
│ │ ├── stm32f4xx_fmpi2c.h
│ │ ├── stm32f4xx_fsmc.h
│ │ ├── stm32f4xx_gpio.h
│ │ ├── stm32f4xx_hash.h
│ │ ├── stm32f4xx_i2c.h
│ │ ├── stm32f4xx_iwdg.h
│ │ ├── stm32f4xx_lptim.h
│ │ ├── stm32f4xx_ltdc.h
│ │ ├── stm32f4xx_pwr.h
│ │ ├── stm32f4xx_qspi.h
│ │ ├── stm32f4xx_rcc.h
│ │ ├── stm32f4xx_rng.h
│ │ ├── stm32f4xx_rtc.h
│ │ ├── stm32f4xx_sai.h
│ │ ├── stm32f4xx_sdio.h
│ │ ├── stm32f4xx_spdifrx.h
│ │ ├── stm32f4xx_spi.h
│ │ ├── stm32f4xx_syscfg.h
│ │ ├── stm32f4xx_tim.h
│ │ ├── stm32f4xx_usart.h
│ │ └── stm32f4xx_wwdg.h
│ └── src
│ ├── misc.c
│ ├── stm32f4xx_adc.c
│ ├── stm32f4xx_can.c
│ ├── stm32f4xx_cec.c
│ ├── stm32f4xx_crc.c
│ ├── stm32f4xx_cryp_aes.c
│ ├── stm32f4xx_cryp.c
│ ├── stm32f4xx_cryp_des.c
│ ├── stm32f4xx_cryp_tdes.c
│ ├── stm32f4xx_dac.c
│ ├── stm32f4xx_dbgmcu.c
│ ├── stm32f4xx_dcmi.c
│ ├── stm32f4xx_dfsdm.c
│ ├── stm32f4xx_dma2d.c
│ ├── stm32f4xx_dma.c
│ ├── stm32f4xx_dsi.c
│ ├── stm32f4xx_exti.c
│ ├── stm32f4xx_flash.c
│ ├── stm32f4xx_flash_ramfunc.c
│ ├── stm32f4xx_fmc.c
│ ├── stm32f4xx_fmpi2c.c
│ ├── stm32f4xx_fsmc.c
│ ├── stm32f4xx_gpio.c
│ ├── stm32f4xx_hash.c
│ ├── stm32f4xx_hash_md5.c
│ ├── stm32f4xx_hash_sha1.c
│ ├── stm32f4xx_i2c.c
│ ├── stm32f4xx_iwdg.c
│ ├── stm32f4xx_lptim.c
│ ├── stm32f4xx_ltdc.c
│ ├── stm32f4xx_pwr.c
│ ├── stm32f4xx_qspi.c
│ ├── stm32f4xx_rcc.c
│ ├── stm32f4xx_rng.c
│ ├── stm32f4xx_rtc.c
│ ├── stm32f4xx_sai.c
│ ├── stm32f4xx_sdio.c
│ ├── stm32f4xx_spdifrx.c
│ ├── stm32f4xx_spi.c
│ ├── stm32f4xx_syscfg.c
│ ├── stm32f4xx_tim.c
│ ├── stm32f4xx_usart.c
│ └── stm32f4xx_wwdg.c
├── main.map
├── Makefile
├── startup_stm32f407xx.s
├── STM32F407IGHx_FLASH.ld
├── STM32F407.svd
└── User
├── main.c
├── spi.c
├── spi.h
├── usart.c
└── usart.h
1.Arm Gcc 编译器及其选项介绍
arm-none-eabi-gcc #编译器
arm-none-eabi-as #汇编器
arm-none-eabi-ld#链接器
arm-none-eabi-objcopy#目标文件格式转换
常用编译选项(arm-none-eabi-gcc):
-mthumb -mcpu=cortex-m4 #处理器架构选项 M4/M3/M7
--specs=nosys.specs #
arm-none-eabi
工具链带有两个基于newlib
的库可供选择(newlib
和newlib_nano
)可选参数有 nosys.specs / nano.specs 注意:这即是一个编译选项也是一个链接选项-Wall #使能所有警告
-O0 #编译优化选项,可以为(数字 0 1 2 3)
-g #产生调试信息
-I 头文件路径 #指定用户头文件搜索目录
-D #全局宏定义相当于#define
链接常用选项(arm-none-eabi-ld):
-mthumb -mcpu=cortex-m4 #处理器架构选项 M4/M3/M7
--specs=nosys.specs #
arm-none-eabi
工具链带有两个基于newlib
的库可供选择(newlib
和newlib_nano
)可选参数有 nosys.specs / nano.specs 注意:这即是一个编译选项也是一个链接选项-Wl,-Map=main.map #Wl后面的东西是作为参数传递给链接器ld,-map是生成map文件
-static #此选项将禁止使用动态库
-g #产生调试信息
有更详细的文档,请移步到这个链接:
(三)Makefile
我先给出我自己写的一个Makefile文档,功能不多,日常用。
- TARGET = main
- #定义编译器
- CC := arm-none-eabi-gcc
- AS :=arm-none-eabi-as
- LD :=arm-none-eabi-ld
- AR :=arm-none-eabi-ar
- OBJCOPY :=arm-none-eabi-objcopy
- #定义启动文件和链接文件
- START_FILE = startup_stm32f407xx.s
- LINK_FILE =./STM32F407IGHx_FLASH.ld
- #定义头文件搜索路径
- include = -I /home/fxx/Desktop/Project/CMSIS/Inc/
- include += -I /home/fxx/Desktop/Project/Dev/inc/
- include += -I /home/fxx/Desktop/Project/User/
- define = -D STM32F40_41xxx
- #定义c文件搜索路径
- vpath %%.c ./CMSIS/Src
- vpath %%.c ./Dev/src
- vpath %%.c ./User
- vpath %%.o ./Build
- #定义编译选项
- CFLAGS = -mcpu=cortex-m4 --specs=nosys.specs -Wall -Wextra -g -O0 -fcond-mismatch $(include) $(define) -MD
- ASFLAGS = -mcpu=cortex-m4
- LDFLAGS = -mcpu=cortex-m4 --specs=nosys.specs -O0 -static -g -Wl,-Map=main.map
- #要编译的c文件
- C_SOURCE = stm32f4xx_rcc.c stm32f4xx_gpio.c stm32f4xx_spi.c stm32f4xx_usart.c system_stm32f4xx.c usart.c spi.c misc.c main.c
- O_OBJ =$(C_SOURCE:%%.c=%%.o)
- AS_OBJ =$(START_FILE:%%.s=%%.o)
- $(warning $(O_OBJ))
- $(warning $(C_SOURCE))
- all:bin
- elf:$(O_OBJ) $(AS_OBJ)
- $(CC) $(LDFLAGS) $(addprefix ./Build/,$(O_OBJ)) $(addprefix ./Build/,$(AS_OBJ)) -T $(LINK_FILE) -o ./Build/$(TARGET).elf
- bin:elf
- $(OBJCOPY) ./Build/$(TARGET).elf ./Build/$(TARGET).bin
- $(OBJCOPY) ./Build/$(TARGET).elf ./Build/$(TARGET).hex
- $(AS_OBJ):$(START_FILE)
- $(AS) $(ASFLAGS) -c $^ -o ./Build/$@
- $(O_OBJ):%%.o:%%.c
- $(CC) $(CFLAGS) -c $< -o ./Build/$@
- clean:
- rm -rf ./Build/*.o ./Build/*.d ./*.map ./Build/*.elf ./Build/*.bin ./Build/*.hex
要学习Makefile的请移步到下面链接:
(四)cortex-debug的配置:
在vscod中按:ctrl+shift+d 跳转到调试界面
新建一个lauch.json文件
具体配置如下:
- {
- "configurations": [
- {
- "cwd": "${workspaceRoot}",
- "executable": "./Build/main.elf",
- "name": "Debug Microcontroller",
- "request": "launch",
- "type": "cortex-debug",
- "showDevDebugOutput": false,
- "servertype": "openocd",
- "configFiles": [
- "/usr/share/openocd/scripts/interface/stlink.cfg",
- "/usr/share/openocd/scripts/target/stm32f4x.cfg"
- ],
- "svdFile": "./STM32F407.svd"
- }
- ]
- }
具体配置参数请移步至下面链接学习:
后记
本文也是拾人牙慧,自创极少,若有不当之处,还望各位读者能够及时斧正。