目录
一、平台配置
二、在ubuntu下使用串口来烧录至目标文件至STM32F07
(一)ubuntu下stm32flash工具下载
(二)Ubuntu20.04安装stm32开发环境
(三)将nuttx.bin文件烧录进stm32
三、ubuntu下使用OpenOCD进行烧录nuttx系统
(一)什么是OpenOCD(Open On-Chip Debugger)
(二)安装OpenOCD
(三)运行
(四)使用OpenOCD烧录nuttx.bin
一、平台配置
在这里选择的芯片为STM32F407ZGT6
,于是我们在nuttx的支持平台中选择:stm32f4discovery
。前面的文章是在虚拟器上跑的,这个时候我们需要部署到真正的嵌入式平台上,首先我们需要对已经配置的系统进行:
make clean
make distclean
之后选择stm32f4上部署我们的操作系统:
./tools/configure.sh -l stm32f4discovery:nsh
-l表示告诉用户是在Linux上构建的。构建的时候可以看到我们stm32的库文件,已经被包括进去了:
之后输入make
开始编译。编译后我们可以看到下面的提示,这个时候已经生成了相应的文件:
那么接下来是要将这个nuttx.bin
文件烧录进去我们的板子中。
二、在ubuntu下使用串口来烧录至目标文件至STM32F07
(一)ubuntu下stm32flash工具下载
GitHub:https://github.com/ARMinARM/stm32flash
这个工具的作用如下:
在nuttxspace下新建一个stm32flash文件夹,将GitHub上面的代码clone下来:
git clone https://github.com/ARMinARM/stm32flash.git
之后在当前目录下进行编译:make -j4
。
出现错误:
打开i2c.c
文件中,加入这句:
#define I2C_FUNC_I2C I2C_FUNCS
之后即可编译成功:
执行命令安装stm32flash:
sudo make install
安装成功提示:
这个工具的用法可以输入./stm32flash -h
进行查阅。
获取设备信息:
./stm32flash /dev/ttyS0
(二)Ubuntu20.04安装stm32开发环境
-
安装gcc-arm-nano-eabi
这一步是要安装运行在x86平台的gcc编译器,而这个编译器编译出的代码是要在ARM平台(stm32)上跑的,因此这种编译器被我们称之为交叉编译器
。
那么首先我们要进入官网:Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer下载对应的交叉编译器:
解压并且重命名为gcc-arm-none-eabi
,并且从终端进入查看文件夹内容,可以看看bin的内容:
之后我们将我们的bin路径添加到环境变量中:
gedit ~/.bashrc
#添加到最后
export PATH=$PATH:/home/zhengxiting/gcc-arm-none-eabi/gcc-arm-none-eabi-10.3-2021.10/bin
source ~/.bashrc
之后重启终端,如果输入arm-none-并按下两次Tab键并且能自动补齐,那么则说明环境变量添加成功:
上面是安装交叉编译器的一种方法,其实也可以简单粗暴的进行:
sudo apt-get install gcc-arm-none-eabi
下面是安装其他的一些依赖
sudo apt-get install gcc
sudo apt-get install make
sudo apt-get install openocd
- 软件安装
所需软件有:STM32CubeMX、VSCode、GNU Arm Embedded Toolchain、Mingw-w64。
进入STM32CubeMX官网进行下载:my.st.com
那么具体的安装网上有很多。
安装VSCode:Download Visual Studio Code - Mac, Linux, Windows
下载后执行:
sudo dpkg -i code_1.69.2-1658162013_amd64.deb
需要安装的插件:
(三)将nuttx.bin文件烧录进stm32
烧录之前首先得看看开发板的数据手册,将其进入系统烧录模式,STM32具有三种启动模式:
- BOOT1 = x,BOOT0 = 0,芯片内置flash,即主存储器Flash。
- SRAM:BOOT1 = 1,BOOT0 = 1,芯片内置的SRAM区,也就是内存。
- 系统存储器:BOOT1 = 0,BOOT0 = 1,芯片内部的一块特定的区域,叫做系统存储器。
可以执行如下命令得知stm32的状态,使用USB-TTL设备连接并进行镜像烧录,执行:
sudo stm32flash /dev/ttyUSB0
出现报错:
stm32flash 0.4http://stm32flash.googlecode.com/Interface serial_posix: 57600 8E1
Failed to init device.
这个问题网上说只要boot键设置得对,再复位一下就可以了。
之后使用如下命令烧录文件:
sudo stm32flash -w nuttx.bin -v -g 0 /dev/ttyUSB0
即可将操作系统烧录进去。之后将Boot0以及Boot1全部置为0,然后重新上电,之后使用串口登陆stm32:
sudo apt install minicom
sudo minicom -D /dev/ttyUSB0
三、ubuntu下使用OpenOCD进行烧录nuttx系统
在当前的快发环境下,嵌入式工程师都会十分熟悉自己项目使用到的调试器还有调试软件,比较熟悉的有JTAG、SWD、CMSIS-DAP等,那么这些东西的工作原理是什么,可能未必都是清楚的,那么就首先进入什么是OpenOCD这一栏吧:
(一)什么是OpenOCD(Open On-Chip Debugger)
OpenOCD是一款开源软件,他的功能是在仿真器的辅助下完成的,仿真器是能够提供调试目标的电信号的小型硬件单元。仿真器也是必须的,因为调试主机(运行OpenOCD的主机)通常不具备这种电信号的直接解析功能。(这个仿真器也就是我们一直使用的J-Link等设备)。
仿真器支持一个或多个传输协议,每个协议涉及不同的电信号,且使用不同的协议栈进行消息传输。它有时候也会被封装成独立的加密狗,称为硬件加密狗。一些开发板上面直接集成了硬件接口加密狗,这样可以使开发板通过USB直接连到主机上进行调试。
- 那么JTAG与SWD有什么区别?
JTAG支持仿真器支持JTAG信号,可以用来进行TAPs和目标板子之间符合JTAG协议的通讯。TAP是处理特殊指令和数据的单元。JTAG支持调试和边界扫描。
SWD信号支持与一些比较新的ARM芯片进行通讯,而且还可以作为同时支持JTAG和SWD的芯片的仿真器。不过SWD支持调试,不支持边检扫描。
对于一些芯片,还有专门的编程下载器,这些下载器仅支持擦写flash的功能,不支持调试和边界扫描。对于此类专用下载器,OpenOCD并不支持。
(二)安装OpenOCD
官网下载:OpenOCD - Open On-Chip Debugger download | SourceForge.net
解压后进入目录中,并且在终端打开:
tar -jxvf openocd-0.12.0-rc1.tar.bz2
cd openocd-0.12.0-rc1
./configure -h
因为我是用的是stlink
所以我需要这么实现:
./configure --enable-stlink
之后可以使用./configure
实现这个配置。
出现问题:configure: error: libusb-1.x is required for the ST-Link Programmer
:
sudo apt-get install libusb-1.0.0-dev
之后就可以看到:
在这里需要注意的是,OpenOCD可以使用gcc和clang两个编译器进行编译,但这个OpenOCD有个bug,需要忽略warning,我们再进行设置一下:
./configure --disable--werror
设置完后进行make
。运行软件安装,默认路径为/usr/local/share
:
sudo make install
之后执行openocd -v
看看有没有安装成功:
如果后续需要卸载openocd,那么我们需要执行:make uninstall
。
(三)运行
安装好OpenOCD后,我们需要根据操作系统,设置访问debug适配器的权限。在Linux系统上,通常会涉及etc/udev/rules.d
文件夹的操作。OpenOCD会附带一个通用规则文件60-openocd.rules
,位置在于OpenOCD解压后的文件夹contrib
目录中。这个时候我们需要把我们的60-openocd.rules
拷贝过去。
sudo cp 60-openocd.rules /etc/udev/rules.d/
最后可以看看openocd的服务,可以输入--help
来实现:
Open On-Chip Debugger 0.12.0-rc1
Licensed under GNU GPL v2
For bug reports, readhttp://openocd.org/doc/doxygen/bugs.html
Open On-Chip Debugger
Licensed under GNU GPL v2
--help | -h display this help
--version | -v display OpenOCD version
--file | -f use configuration file <name>
--search | -s dir to search for config files and scripts
--debug | -d set debug level to 3| -d<n> set debug level to <level>
--log_output | -l redirect log output to file <name>
--command | -c run <command>
如果没有输入 -f
或者是-c
的选项命令,OpenOCD会试图读取openocd.cfg
这个配置文件。如果我们需要指定配置文件,比如我们需要部署到这个STM32F07这个板子,我们需要输入这个:
openocd -f interface/jlink.cfg -c 'transport select swd' -f target/stm32f4x.cfg
其他命令可以在该文件夹的README
中查看。
使用lsusb
命令进行查看当前使用的端口以及型号Bus 002 Device 015: ID 1366:0105 SEGGER J-Link
。会打印这样的debug信息:
(四)使用OpenOCD烧录nuttx.bin
首先熟悉一下OpenOCD的指令:
-f interface/jlink.cfg 配置下载工具
-c init 初始化
-c halt 目标芯片挂起,停机
-c flash write_image erase <下载的目标bin> <flash烧写起始地址> 配置下载源文件
-c reset 复位
那么我们进入nuttx文件中,执行如下:
openocd -f interface/jlink.cfg -c 'transport select swd' -f target/stm32f4x.cfg -c "program nuttx.bin exit 0x08000000"
那么这个时候我们已经将系统烧录进去了,然后我们可以打开minicom,我们终端的指令是在串口打印出来的,所以我们需要有一个USB-TTL
来进行连接,然后:
sudo minicom -D /dev/ttyUSB
这样子就成功部署啦!!