你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用Linux、GNU Make和OpenOCD将代码上载到STM32L4

[复制链接]
点点&木木 发布时间:2018-11-22 13:12
这是关于如何使用Linux上的开源命令行工具使STM32的基础项目工作的逐步指南。
图片4.png
项目中使用的东西
硬件组件
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 $^ $@

收藏 1 评论4 发布时间:2018-11-22 13:12

举报

4个回答
stm1024 回答时间:2018-11-22 13:27:13
不错哦,刚拿到一块767的nucleo板子
黑皮男 回答时间:2018-11-22 14:15:29
我还是喜欢用cmake, 用着也不赖
mzy2364 回答时间:2018-11-22 14:34:40
谢谢分享,不过Windows上这么方便为什么还要用linux
andeyqi 回答时间:2018-11-22 16:46:56
感谢分享  

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版