Nuttx学习笔记(二)————在STM32上部署Nuttx系统

2023-05-16

目录

一、平台配置

二、在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.4

http://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, read
	http://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

这样子就成功部署啦!! 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nuttx学习笔记(二)————在STM32上部署Nuttx系统 的相关文章

  • 自动驾驶技术-环境感知篇:V2X技术的介绍

    V2X技术概述 在前面的几篇文章分别介绍了自动驾驶在环境感知领域的相关技术点 xff0c 主要介绍了如何通过雷达配合视觉技术实现车辆自身的智能 其实在环境感知方面 xff0c 除了利用车辆自身的智能 xff0c 还可以借助外部环境实现信息的
  • 深度学习分布式策略优化、显存优化、通信优化、编译优化综述

    综述 因为我个人最近在从事可能是AI领域对性能挑战最大的方向 xff0c 自动驾驶领域 xff0c 所以对整个深度学习训练的优化尤为关注 xff0c 最近一直在学习相关内容 xff0c 谨以此篇文章做一个总结 我一直很看好深度学习训练优化这
  • 量子计算机的优势和建设挑战

    1 为什么需要量子计算机 目前大家日常使用的计算机都是经典计算机 xff0c 经典计算机计算性能的发展遵循摩尔定律 xff0c 在价格不变时 xff0c 集成电路上可容纳的晶体管数目 xff0c 约每隔18个月便会增加一倍 性能也将提升一倍
  • 浅谈ChatGPT对生产关系及工具的颠覆影响

    xff08 先歪个楼 xff0c 配图是三体乱纪元 xff0c 证明三体问题无解 xff0c 而ChatGPT证明了AIGC问题是可解的 xff09 最近ChatGPT越来越热 xff0c 仿佛看到了资本市场又一次的爆发 最近周末也会跟几个
  • 蓟门边studio-码农创业路的起点

    蓟门边工作室 xff0c 开张了 先简单介绍下lz的情况吧 xff01 lz是北邮在读硕士 xff0c 码农一枚 断断续续写代码也有一两个年头了 xff0c 但是感觉总是在外面飘着 xff0c 没写过什么大的项目 xff0c 也没真正依靠技
  • 【机器学习算法-python实现】逻辑回归的实现(LogicalRegression)

    转载请注明出处 xff1a http blog csdn net buptgshengod 1 背景知识 在刚刚结束的天猫大数据s1比赛中 xff0c 逻辑回归是大家都普遍使用且效果不错的一种算法 xff08 1 xff09 回归 先来说说
  • 计算机视觉~~~

    这两年 xff0c 计算机视觉似乎火了起来计算机视觉的黄金时代真的到来了吗 xff1f 生物医学 机械自动化 土木建筑等好多专业的学生都开始研究其在各自领域的应用 xff0c 一个视觉交流群里三分之一以上都不是计算机相关专业的 当然 xff
  • 新闻个性化推荐系统(python)-(附源码 数据集)

    1 背景 最近参加了一个评测 xff0c 是关于新闻个性化推荐 说白了就是给你一个人的浏览记录 xff0c 预测他下一次的浏览记录 花了一周时间写了一个集成系统 xff0c 可以一键推荐新闻 xff0c 但是准确率比较不理想 xff0c 所
  • 明天是我的生日,写给24岁的自己

    哎 xff0c 本来想把今晚留给蛋疼的latex 我的导师让我写一篇论文 xff0c 我正在研究怎么用latex 但是想了想 xff0c 明天就过生日了 xff0c 最后一晚还是写点东西 xff0c 静静地思考下 本来想写点东西发到朋友圈或
  • 【码农本色】用数据解读我的2014

    转眼2014就过去了 xff0c 不禁感叹又老了一岁的同时 xff0c 却发现已经快研究生毕业了 xff0c 趁着这个活动简单总结下2014 1 实习篇 2014年一月份拿到了人生第一个实习offer xff0c 在sony这样的大公司做a
  • 如何用PYTHON代码写出音乐

    如何用PYTHON代码写出音乐 什么是MIDI 博主本人虽然五音不全 xff0c 而且唱歌还很难听 xff0c 但是还是非常喜欢听歌的 我一直在做这样的尝试 xff0c 就是通过人工智能算法实现机器自动的作词和编曲 xff08 在这里预告下
  • 普通程序员如何入门AI

    毫无疑问 xff0c 人工智能是目前整个互联网领域最火的行业 xff0c 随着AlphaGo战胜世界围棋冠军 xff0c 以及各种无人驾驶 智能家居项目的布道 xff0c 人们已经意识到了AI就是下一个风口 当然 xff0c 程序员是我见过
  • 深度学习RNN实现股票预测实战(附数据、代码)

    背景知识 最近再看一些量化交易相关的材料 xff0c 偶然在网上看到了一个关于用 RNN实现股票预测的文章 xff0c 出于好奇心把文章中介绍的代码在本地跑了一遍 xff0c 发现可以 work 于是就花了两个晚上的时间学习了下代码 xff
  • 图像拐点检测-原理以及代码实现

    今天带来的内容只用两个字形容 干货 xff01 xff01 首先我们科普下图像识别的常识 xff0c 图片在电脑看来 xff0c 其实就是一个矩阵 xff0c 每个矩阵中的一个值都对应图片的一个像素点 xff08 下图摘自 机器学习实践应用
  • c#如何实现在两个窗体(Form)间传输数据或变量

    在父窗体中显示子窗体时 xff0c 加上子窗体 Owner 61 this 在子窗体中定义一个父窗体对象 xff0c 在Load函数里面让父窗体对象 61 xff08 父窗体类型 xff09 this Owner 然后用这个父窗体对象就可以
  • docker容器webui界面之portainer

    docker通常下都是命令行管理 xff0c 不太方便 xff0c web管理能直观一点 xff0c 如果是公司有运维组 xff0c ssh账号也不用给到开发这边 单机安装命令 docker run d p 19000 9000 name
  • Windows 10安装ubuntu18.04双系统(bios和boot manager)

    1 按照网上教程制作系统盘 xff1b 2 在windows下创建空白区 xff0c 为ubuntu分配空间 xff1b 3 用做好的系统盘安装系统 由于各个厂商计算机的bios和boot manager启动键不同 xff0c 自行百度 本
  • OpenCv入门(三)——阈值化处理

    目录 0x01 OTSU 0X02 固定阈值化 0x03 自适应阈值化 0x04 双阈值化 0x05 半阈值化 在图像处理中 xff0c 处理灰度图像的计算量要小于处理彩色图像 xff0c 而二值化图像 xff08 只含灰度值0或1 xff
  • 运行gazebo时出现[Err] [REST.cc:205] Error in REST request

    出现错误 xff1a Err REST cc 205 Error in REST request libcurl 51 SSL no alternative certificate subject name matches target h
  • 安装双系统ubuntu18.04后,不能进入ubuntu界面的解决办法

    某天晚上电脑自动升级了bios xff0c 作为新手小白此时还没有意识到问题 第二天开机发现电脑不仅不能进去ubuntu xff0c 连bios都进不去了 多次开机关机重复后 xff0c 灵机一动改成重启 xff0c 终于有进入bios的界

随机推荐

  • Python中集合的使用

    1 set add xff09 xff1a 向集合中添加元素 xff0c 是整体添加进集合set中 xff1b set update 向集合中添加元素 xff0c update是将字符串中的拆分成字符进行追加 xff1b eg s1 61
  • Resource not found问题

    在运行ros中的xacro文件时出现的如下问题 resource not found mbot description ROS path 0 61 opt ros melodic share ros ROS path 1 61 opt ro
  • 启动Moveit Setup Assistant出错

    1 首先安装moveit配置助手 xff0c 我的ubuntu版本是18 04 xff0c 所以运行 xff1a sudo apt get install ros melodic moveit 填写个人密码安装 source opt ros
  • 形参如何改变实参

    把实参数组传递给函数 xff0c 则形参从数组那里得到了起始地址 xff0c 因此数组与实参数组共占了同一段内存单元 xff0c 在函数调用期间 xff0c 该变了形参数组的值 xff0c 也就改变了实参数组的值 例 xff1a int i
  • Linux下ARM 和单片机的串口通信设计

    摘要 xff1a 介绍Linux 环境下串口通信的设计方法和步骤 xff0c 并介绍了ARM9 微处理器s3c2440 在Linux 下和C8051Fxxx 系列单片机进行串行通信的设计方法 xff0c 给出了硬件连接和通信程序流程图 该方
  • AT+CSQ信号质量指示含义

    AT 43 CSQ 命令解释 xff1a 检查网络信号强度和SIM卡情况 命令格式 xff1a AT 43 CSQ lt CR gt 命令返回 xff1a AT 43 CSQ lt rssi gt lt ber gt 其中 lt rssi
  • MIPI接口和DVP接口的区别及优点

    DVP是并口 xff0c 需要PCLK VSYNC HSYNC D 0 xff1a 11 可以是8 10 12bit数据 xff0c 看ISP或baseband是否支持 xff1b MIPI是LVDS xff0c 低压差分串口 只需要要CL
  • 立体耳机插头和四极耳机插头三段、四段处的区别

    立体 耳机插头 和四极 耳机插头 三段 四段处的区别 在日常生活中 xff0c 通常较为细心的消费者就会发现 xff0c 适用于NOKIA手机的 耳机插头 和适用于iphone的 耳机插头 是互补兼容的 xff0c 但是iphone HTC
  • Nuttx学习笔记(一)

    最近在工作上需要用到这个nuttx实时操作系统 xff0c 并且对这个系统进行学习记录以及记录下自己所遇到过的问题 目录 一 环境配置 xff08 1 xff09 基础环境 xff08 2 xff09 下载nuttx xff08 3 xff
  • kernel command line 参数详解

    Linux内核在启动的时候 xff0c 能接收某些命令行选项或启动时参数 当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值 xff0c 可以通过这种方式手动将这些参数传递给内核 如果不使用启动管理器 xff0c 比
  • Internal error: Oops:

    01 02 00 02 24 110 SysRq Emergency Remount R O 01 02 00 02 24 221 mdss fb release all unknown process adbd pid 61 415 mf
  • /proc/meminfo详解

    cat proc meminfo MemTotal 2052440 kB 总内存 MemFree 50004 kB 空闲内存 Buffers 19976 kB 给文件的缓冲大小 Cached 436412 kB 高速缓冲存储器 http b
  • 浅谈Camera工作原理

    一 摄像头简介 摄像头 xff08 CAMERA xff09 又称为电脑相机 电脑眼等 xff0c 它作为一种视频输入设备 xff0c 在过去被广泛的运用于视频会议 远程医疗及实时监控等方面 近年以来 xff0c 随着互联网技术的发展 xf
  • EVT、DVT、PVT、MP等简介

    PLM xff08 Product Lifecycle Management xff09 System xff1a PLM是协助产品能够顺利完成在新产品开发 xff08 NPI xff1a New Product Introduction
  • UbuntuServer 12.04 svn服务的创建

    以下是我整理后的步骤 xff1a 1 安装必要的软件包 xff1a sudo apt get install subversion sudo apt get install libapache2 svn 2 创建一个SVN账号和SVN组 x
  • 在ESXi上把OpenWrt变成真正的路由器

    前面把openwrt装到了VMware workstation上 xff0c 本来想把openwrt直接安装到ESXi的 xff0c 但是转换镜像的时候不能生成OVF或者OVA文件 所以就先把镜像安装到了workstation xff0c
  • 电源和电池两种电源选一的芯片

  • can总线中的SOF、SRR、IDE和RTR数据位都是指什么

    帧起始 SOF xff1a 帧起始 SOF 标志着数据帧和远程帧的起始 xff0c 仅由一个 显性 位组成 仲裁域由标识符和RTR位组成 xff0c 标准帧格式与扩展帧格式的仲裁域格式不同 标准格式里 xff0c 仲裁域由1l位标识符和RT
  • linux makefile的一些变量

  • Nuttx学习笔记(二)————在STM32上部署Nuttx系统

    目录 一 平台配置 二 在ubuntu下使用串口来烧录至目标文件至STM32F07 xff08 一 xff09 ubuntu下stm32flash工具下载 xff08 二 xff09 Ubuntu20 04安装stm32开发环境 xff08