WHCSRL 技术网

在linux下开发stm32体验及心得(经验贴)

目录

一、前言

二、arch Linux的安装,及其工具链、编译选项、Makefile的介绍

(一)archLinux的安装

1.常用工具的安装

(二)建立工程文件

(三)Makefile

(四)cortex-debug的配置:

 后记


一、前言

    近半年来,随着windows10的更新,在windows上开发stm32越发感觉不舒服(指windows平台,当然keill也不舒服),每每感觉windows的弹窗、广告、浏览器等问题愈发严重、keill的授权也始终萦绕在心头,多次想切换到linux下试一试,但每次切换过去不到一周又切换到windows系统。在这中间也是试了不少linux发行版。在这样不断的切换中逐渐厌烦(鬼知道我在windows下安装了多少遍驱动,在Linux下重装了多少工具。。。。。泪目),最选择了arch linux(无他,只是听说很难,不好安装,就一头沉进去了)。为了能继续在野生钢铁侠的路上越走越远,又开始在Linux上搭建开发平台,搞调试、串口等工具也是一阵摸索,为了各位同仁再遇到一样的情况下快速的上手Linux下stm32开发,遂在此抛砖引玉。

二、arch Linux的安装,及其工具链、编译选项、Makefile的介绍

(一)archLinux的安装

    archLinux的安装我强烈建议看这一篇文档:

Arch Linux 安装使用教程 - ArchTutorial - Arch Linux StudioArch Linux 安装使用教程,每月实时更新!包含从 archlinux 安装,魔法充能,到显卡驱动,日常软件的使用等,另附媒体制作,编程等你可能需要的全部内容。让 Arch Linux 成为你的常用系统吧!https://archlinuxstudio.github.io/ArchLinuxTutorial/#/rookie/archlinux_pre_install

    这一篇包含了基本系统的安装,驱动的安装,桌面环境的安装,以及常用工具的安装,而且更新很及时。

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:

Visual Studio Code (简体中文) - ArchWiki

     在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 的库可供选择(newlibnewlib_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 的库可供选择(newlibnewlib_nano)可选参数有 nosys.specs  / nano.specs  注意:这即是一个编译选项也是一个链接选项

-Wl,-Map=main.map #Wl后面的东西是作为参数传递给链接器ld,-map是生成map文件

-static #此选项将禁止使用动态库

-g #产生调试信息

    有更详细的文档,请移步到这个链接:

gcc for arm 工具链使用(一)_fdcp123的专栏-CSDN博客

(三)Makefile

我先给出我自己写的一个Makefile文档,功能不多,日常用。

  1. TARGET = main
  2. #定义编译器
  3. CC := arm-none-eabi-gcc
  4. AS :=arm-none-eabi-as
  5. LD :=arm-none-eabi-ld
  6. AR :=arm-none-eabi-ar
  7. OBJCOPY :=arm-none-eabi-objcopy
  8. #定义启动文件和链接文件
  9. START_FILE = startup_stm32f407xx.s
  10. LINK_FILE =./STM32F407IGHx_FLASH.ld
  11. #定义头文件搜索路径
  12. include = -I /home/fxx/Desktop/Project/CMSIS/Inc/
  13. include += -I /home/fxx/Desktop/Project/Dev/inc/
  14. include += -I /home/fxx/Desktop/Project/User/
  15. define = -D STM32F40_41xxx
  16. #定义c文件搜索路径
  17. vpath %%.c ./CMSIS/Src
  18. vpath %%.c ./Dev/src
  19. vpath %%.c ./User
  20. vpath %%.o ./Build
  21. #定义编译选项
  22. CFLAGS = -mcpu=cortex-m4 --specs=nosys.specs -Wall -Wextra -g -O0 -fcond-mismatch $(include) $(define) -MD
  23. ASFLAGS = -mcpu=cortex-m4
  24. LDFLAGS = -mcpu=cortex-m4 --specs=nosys.specs -O0 -static -g -Wl,-Map=main.map
  25. #要编译的c文件
  26. 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
  27. O_OBJ =$(C_SOURCE:%%.c=%%.o)
  28. AS_OBJ =$(START_FILE:%%.s=%%.o)
  29. $(warning $(O_OBJ))
  30. $(warning $(C_SOURCE))
  31. all:bin
  32. elf:$(O_OBJ) $(AS_OBJ)
  33. $(CC) $(LDFLAGS) $(addprefix ./Build/,$(O_OBJ)) $(addprefix ./Build/,$(AS_OBJ)) -T $(LINK_FILE) -o ./Build/$(TARGET).elf
  34. bin:elf
  35. $(OBJCOPY) ./Build/$(TARGET).elf ./Build/$(TARGET).bin
  36. $(OBJCOPY) ./Build/$(TARGET).elf ./Build/$(TARGET).hex
  37. $(AS_OBJ):$(START_FILE)
  38. $(AS) $(ASFLAGS) -c $^ -o ./Build/$@
  39. $(O_OBJ):%%.o:%%.c
  40. $(CC) $(CFLAGS) -c $< -o ./Build/$@
  41. clean:
  42. rm -rf ./Build/*.o ./Build/*.d ./*.map ./Build/*.elf ./Build/*.bin ./Build/*.hex

要学习Makefile的请移步到下面链接:

跟我一起写 Makefile(一)_陈皓专栏 【空谷幽兰,心如皓月】-CSDN博客_makefile

(四)cortex-debug的配置:

在vscod中按:ctrl+shift+d 跳转到调试界面

新建一个lauch.json文件

具体配置如下:

  1. {
  2. "configurations": [
  3. {
  4. "cwd": "${workspaceRoot}",
  5. "executable": "./Build/main.elf",
  6. "name": "Debug Microcontroller",
  7. "request": "launch",
  8. "type": "cortex-debug",
  9. "showDevDebugOutput": false,
  10. "servertype": "openocd",
  11. "configFiles": [
  12. "/usr/share/openocd/scripts/interface/stlink.cfg",
  13. "/usr/share/openocd/scripts/target/stm32f4x.cfg"
  14. ],
  15. "svdFile": "./STM32F407.svd"
  16. }
  17. ]
  18. }

    具体配置参数请移步至下面链接学习:

Cortex-debug 调试器使用介绍_Null-CSDN博客

 后记

    本文也是拾人牙慧,自创极少,若有不当之处,还望各位读者能够及时斧正。

推荐阅读