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

news/2024/4/29 2:08:44/文章来源:https://blog.csdn.net/Alkaid2000/article/details/127620450

目录

一、平台配置

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

这样子就成功部署啦!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_410097.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工厂人员着装识别检测

工厂人员着装识别检测&#xff0c;依据智能视频分析和神经网络算法技术&#xff0c;实时分析和识别现场监控视频画面信息。工厂人员着装识别检测针对不穿工装的行为及时报警抓拍&#xff0c;将警报截屏和视频保存到数据库系统中发给后台&#xff0c;并把违规记录推送到有关人员…

基于jeecgboot的flowable流程支持online表单(二)

这部分很多功能代码由网友撼动宇宙提供&#xff0c;这里先感谢这位网友的辛苦工作 这部分主要是online表单的显示与录入数据获取 1、先建两个表 -- ---------------------------- -- Table structure for bpm_tool_designer -- ---------------------------- DROP TABLE IF E…

Presto和Spark语法差异

一、同类实现差异 1、Presto整数相除沿用了Java整数相除的特性&#xff0c;而Spark除法会得到小数。 示例&#xff1a; select 5/2; Presto返回2&#xff0c;Spark返回2.5。 2、Presto的substr()函数的子字符串索引从1开始&#xff0c;而spark从0开始。 示例&#xff1a;…

用于一般光学系统的光栅元件

摘要 光栅是光学中最常用的衍射元件之一。如今&#xff0c;它们经常被用于复杂的系统中&#xff0c;并与其他元件一起工作。在这种情况下&#xff0c;非常需要将光栅不仅仅是作为孤立的元件来模拟&#xff0c;而是与系统的其余部分结合&#xff0c;以评估整个系统性能。Virt…

并发与多线程(4)单例设计模式共享数据分析 和call_once

一、单例模式 顾名思义就是一个项目中的某个类只有一个对象&#xff0c;不允许在外面new 出第二个对象 #if 1 //单例模式 :class MyClass { private:MyClass(){}static MyClass* m_instance; // public:static MyClass* getInstance(){if (m_instance NULL){m_instance …

推荐一个.Net Core轻量级插件架构

今天给大家推荐一个开源插件架构。在介绍项目之前&#xff0c;我们了解下什么是插件架构&#xff0c;它的用处。 现有的软件开发中&#xff0c;业务越来越复杂&#xff0c;一些大型的项目版本一直在迭代&#xff0c;代码规模越来越大&#xff0c;涉及的人员也越来越多&#xf…

电子江湖里,女攻城狮到底是一种怎样的存在?

关于电子工程师这一角色&#xff0c;女生真的不能胜任么&#xff1f;我觉得不然&#xff01; 虽然说出身电子信息类的女生并不算多&#xff0c;去到职场中就职且能坚持下去的更是少之又少&#xff0c;毕竟理工科嘛&#xff0c;加上真实存在的行业歧视&#xff0c;想要靠近的女生…

学长教你学C-day5-C语言变量与数据类型

小韩是一个学习比较刻苦认真的学生&#xff0c;虽然老师上课进度刚讲到输入输出&#xff0c;但是小韩已经自学到C语言指针部分的内容了。但是进度太快的弊端就是有些东西很难消化吸收&#xff0c;这不就遇到了问题&#xff0c;来请教小刘&#xff1a;“学长&#xff0c;你说这个…

机器学习——聚类分析

文章目录聚类分析K-means算法K-中心算法DBSCAN算法聚类分析 K-means算法 算法简要步骤 随机选取K个样本点&#xff08;不一定来自样本数据&#xff09;作为初始的质心第一次迭代&#xff0c;将所有样本分配到这K个类中 对每个样本计算其到两个聚类中心的欧式距离&#xff08;…

2022年12个最佳WordPress备份插件比较

您是否正在寻找可靠的WordPress备份插件来定期备份您的网站&#xff1f; 备份就像您网站的安全网。每当您的网站因任何原因崩溃时&#xff0c;您都可以快速恢复您的网站。但是您需要确保您的备份具有最新的更改&#xff0c;否则您可能会丢失重要数据。一个好的备份插件将确保您…

艾美捷藻红蛋白RPE化学性质文献参考

艾美捷藻红蛋白RPE背景&#xff1a; R-藻红蛋白是从海藻&#xff08;甘紫菜或高氏肠枝藻&#xff09;分离的藻胆蛋白家族成员。从红藻中分离得到 R- 藻红蛋白(PE)。其主吸收峰位于565nm&#xff0c;次吸收峰位于496nm 和545nm。次级峰的相对显著性在不同种的 R-PE 中差异显著。…

前端开发学习之【Vue】-下

文章目录Vuex1.概述2.使用3.四个 map 方法4.模块化命名空间Vue Router1.SPA2.路由3.基本使用4.多级路由5.路由传参query参数6.命名路由7.路由传参params参数8.路由的props配置9.路由跳转方式10.缓存路由11. activated deactivated生命周期钩子12.路由守卫13.路由器的两种工作模…

极限多标签算法: FastXML 的解析

文章目录前言1.关于极限多标签 (XML: eXtreme multi-label Classification)1.1 流派1.2 评价指标2.FastXML2.1 FastXML的特点2.2 FastXML的局部性2.3 FastXML的拟合目标2.4 通过代码分析FastXML的拟合细节2.4.1 r\mathbf{r}^{}r的优化与拟合2.4.2 δ\deltaδ的优化与拟合 ---- …

知识图谱-命名实体-关系-免费标注工具-快速打标签-Python3

知识图谱-命名实体-关系-免费标注工具-快速打标签-Python3一、功能介绍1、代码文件夹结构2、运行环境3、自定义命名实体、关系模板4、导入文件5、选择自定义实体和关系文件6、文本标注7、撤销和取消标注8、导出和导出并退出系统9、导出文件后解析10、标注规范和KG规范11、系统提…

SQL学习二十、SQL高级特性

约束&#xff08;constraint&#xff09; 管理如何插入或处理数据库数据的规则。 DBMS 通过在数据库表上施加约束来实施引用完整性。 大多数约束是在 表定义中定义的&#xff0c;用 CREATE TABLE 或 ALTER TABLE 语句。 1、主键 &#xff08;PRIMARY KEY&#xff09; 主键是…

AMCL代码详解(六)amcl中的重采样

1.重采样判断 上一章讲述了amcl中如何根据激光观测更新粒子权重&#xff0c;当粒子更新完后amcl会需要根据程序判断是否需要进行重采样。这个判断在粒子观测更新权重后进行判断&#xff0c;代码在amcl_node.cpp中&#xff1a; if(!(resample_count_ % resample_interval_)){ p…

[GYCTF2020]Easyphp

尝试了一下万能密码不行&#xff0c;又到处翻了一下&#xff0c;扫目录结果又有www.zip 审计代码好久&#xff0c;序列化和sql结合的题还是第一次见&#xff0c;太菜了呀&#xff0c;花了很久时间才理解这个题 首先看到update.php&#xff0c;这个文件是最亮眼的&#xff0c;…

javascript 原生类 DOMParser 把 字符串格式的HTML文档源码 转换成 document DOM对象

文章目录IntroQADOMParser 在 console 的使用cheerio 在 node 项目中的使用Reference测试sumIntro 有一天我在写爬虫。 其实也说不上是爬虫&#xff0c;就是打开浏览器上网&#xff0c;觉得页面有些数据挺有意思&#xff0c;就打开开发者工具&#xff0c;在 Network/Console 中…

01.初识C语言1

一、前期准备 1.gitee网址&#xff08;代码托管网站&#xff09;&#xff1a;工作台 - Gitee.com Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com) 用法&#xff1a; 1&#xff09;新建仓库 2&#xff09;随意勾选 3&#xff09;网络仓库构建完成 2.所学知识&#xff1a;计算…

【期末大作业】基于HTML+CSS+JavaScript网上订餐系统(23个页面)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…