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

使用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
andey 回答时间:2018-11-22 16:46:56
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

相似技术帖

官网相关资源

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