|
这是关于如何使用Linux上的开源命令行工具使STM32的基础项目工作的逐步指南。
项目中使用的东西 硬件组件 STM32核-64电路板 ×1 软件应用程序和在线服务 使用GNU OpenOCD 介绍 这是我去年夏天发布的教程的一个更加详细和极简的版本。我们将创建一个Makefile,该Makefile将交叉编译我们的代码,以针对STM32L4xx Cortex-M4板。然后,我们将学习一种名为OpenOCD的开源工具,它允许我们使用GNU调试器(gdb)交互式地调试我们的代码,并将我们的代码直接flash到我们的板上。 在我们开始之前 在本教程中,我将使用由意法半导体STM32L476核-64板作为目标板。如果您使用的是不同的板子,本教程仍然可以提供在板子上执行相同操作所需的所有步骤,您只需要做一些小的更改,以确保您的板子是目标。 我还演示了如何在Arch Linux上安装和设置这个软件,如果您使用的是不同风格的Linux,那么这应该不是问题,您所要做的就是使用你的包管理器找到包。 开源软件的先决条件 从Linux存储库 这些包应该在大多数发行版上可用(使用Arch作为示例)。 pacman -S gcc make arm-none-eabi-gcc arm-none-eabi-newlib arm-none-eabi-gdb libusb libtool pkg-config autoconf automake git which 安装OpenOCD OpenOCD可以在AUR中使用(对于Arch Linux用户),但是我将从这里的源代码构建它,因为不是每个人都在使用Arch。 git clone git://git.code.sf.net/p/openocd/code cd code/ ./bootstrap ./configuremakesudo make Install cd .. rm -rf code/ 现在我们已经安装了OpenOCD,让我们通过在名为stlink.rules的文件中添加一些udev规则来允许非特权用户运行OpenOCD。 sudo touch /etc/udev/rules.d/stlink.rules 在文件/etc/udev/rules.d/stlink.rules中添加以下几行: KERNEL=="tty[A-Z]*[0-9]", MODE="0666" SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", MODE="0666" 获取CMSIS库 CMSIS库STMicroelectronics提供了一系列头文件和一些启动代码,这是使我们的板正常工作所需要的。为了得到它们,我下载了在页面底部找到的STM32Cube软件。你必须给他们发送你的电子邮件和等待下载链接得到。下载完之后,我最低限度的放弃了休息。我们需要的文件将在下一节中显示。 建立一个简单的blinky项目 我做了一个小项目来演示如何使用Make和OpenOCD。它将pin PC8设置为输出(没有上拉或下拉),然后使用NVIC SysTick中断作为计时器,每一秒钟闪烁一次LED。源代码可以在这里找到。下面显示了您需要的项目目录结构和CMSIS文件。 make-stm32-blinky/ ├── blinky│ ├── inc│ │ └── blinky.h│ ├── main.c│ ├── Makefile│ ├── openocd.cfg│ ├── src│ │ └── blinky.c │ └── STM32L476RG.ld └── CMSIS ├── inc │ ├── arm_common_tables.h │ ├── arm_const_structs.h │ ├── arm_math.h │ ├── cmsis_armcc.h │ ├── cmsis_armcc_V6.h │ ├── cmsis_gcc.h │ ├── core_cm0.h │ ├── core_cm0plus.h │ ├── core_cm3.h │ ├── core_cm4.h │ ├── core_cm7.h │ ├── core_cmFunc.h │ ├── core_cmInstr.h │ ├── core_cmSimd.h │ ├── core_sc000.h │ ├── core_sc300.h │ ├── stm32l476xx.h │ ├── stm32l4xx.h │ └── system_stm32l4xx.h └── src ├── startup_stm32l476xx.s └── system_stm32l4xx.c 您会注意到我在blinky目录中有特定于项目的代码,所有CMSIS特定的东西都在它自己的目录中。还要注意,我有一个名为main的文件。c的基础我的项目目录包含....您已经猜到了,我的main()函数。 要获得我的项目源代码,请使用git: cd make-stm32-blinky/ 使用方法 我在下面的代码部分中包含了我的Makefile。这是非常基本和不优美的,但它完成了工作。它只是指定arm-none-eabi-gcc作为编译器,链接我们的STM32L476RG。ld链接器脚本,使用CFLAGS选项描述目标处理器,最后从CMSIS和当前项目目录中收集所有头/源文件用于编译。要使用make,你只需输入make。 Make Ls # blinky.bin blinky.elf inc main.c Makefile openocd.cfg src STM32L476RG.ld 在项目目录中(在我的例子中是blinky)。然后,它将生成并输出一个ELF格式的文件,供gdb使用,以及一个二进制文件,可用于使用OpenOCD在板上flash。这些文件的名称由Makefile中的PROJ_NAME变量决定。 使用OpenOCD 现在我们已经为处理器编译了一个ELF和二进制文件,我们可以启动OpenOCD。在此之前,您应该先看看openocd。我在下面的代码部分中包含了cfg文件。这个文件告诉OpenOCD使用stm32l4discovery。cfg和stlink-v2-1。程序默认附带的cfg配置文件(位于/usr/share/openocd/scripts/)。现在使用OpenOCD插入您的板到USB端口和类型: openocd 如果你用的是核64型板,你的板上的方形LED现在应该是闪烁的红色和绿色来表示它在调试模式(我认为)。既然OpenOCD已经附加到我们的板子上了,我们需要一种与它交互的方式,我们的两个选项是GDB或telnet,让我们使用GDB,因为它允许我们交互式地调试板子上的代码,并向OpenOCD发出远程命令。 例如,在不关闭运行OpenOCD的终端的情况下,打开第二个终端并进入项目目录 cd ~/make-stm32-blinky/blinky/ 然后使用Makefile提供的编译后的ELF文件启动gdb (ARM版本), arm-none-eabi-gdb ./blinky.elf 现在我们已经在gdb中,我将展示如何附加到OpenOCD会话,然后解释一些有用的命令,下面的行(gdb)前面的行指定我正在gdb中运行这些命令和带有# are注释的行。 # Attach to our OpenOCD server (gdb) target remote # Use gdb to disassemble our main() function (gdb) disass main # The monitor command means we are running the command on our remote host # which is OpenOCD in our case # Run OpenOCD command to halt processor (gdb) monitor reset init # Run OpenOCD command to find targets (gdb) monitor targets # Run OpenOCD command to clear memory of target (gdb) monitor stm32l4x mass_erase 0 # Run OpenOCD command to flash binary file onto our board (gdb) monitor flash write_bank 0 blinky.bin 0 # Run OpenOCD command to run code on target (gdb) monitor reset run 完成 如果你遵循上面的指令(将LED与下拉电阻器连接到PC8)你有机会看到我们的主要()函数得到的汇编代码变成直接到你的板和flash代码使用OpenOCD客户端服务器和gdb。现在,LED应该每一秒钟闪烁一次。退出gdb点击gdb终端并按CTRL+d,退出OpenOCD点击OpenOCD终端并按CTRL+c。最后~ make clean 删除Make过程的输出文件。 感谢你的观看!我希望你觉得这有用。我很想听听你有什么建议,可以帮助简化这个过程,摆脱不必要的代码,或者只是一般的改进。 代码 Makefile openocd.cfg Makefile 用于交叉编译STM32L4xx代码的Makefile文件 # Author: Yusef Karim ##### Project setup ##### # Name of your current project PROJ_NAME = blinky # Directory containing all CMSIS relevent source code CMSIS_DIR = ../CMSIS # Current working directory of our project CWD := $(shell pwd) ##### Compiler options ##### CC = arm-none-eabi-gcc OBJCOPY = arm-none-eabi-objcopy CFLAGS = -g -Wall -TSTM32L476RG.ld CFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4 --specs=nosys.specs CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 ##### Project specific libraries ##### SRC_FILES = main.c SRC_FILES += $(wildcard src/*.c) CFLAGS += -Iinc ##### CMSIS libraries and source code ##### CFLAGS += -I$(CMSIS_DIR)/inc SRC_FILES += $(CMSIS_DIR)/src/* all: $(PROJ_NAME).bin clean: rm -f $(PROJ_NAME).bin $(PROJ_NAME).elf $(PROJ_NAME).elf: $(SRC_FILES) $(CC) $(CFLAGS) -o $@ $^ $(PROJ_NAME).bin: $(PROJ_NAME).elf $(OBJCOPY) -O binary $^ $@ |
| 不错哦,刚拿到一块767的nucleo板子 |
我还是喜欢用cmake , 用着也不赖 |
谢谢分享,不过Windows上这么方便为什么还要用linux |
| 感谢分享 |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版