GCC + Vscode 搭建 nRF52xxx 开发环境

news2024/10/6 5:46:13
在 Windows 下使用 GCC + Vscode 搭建 nRF52xxx 开发环境   ...... by 矜辰所致

前言

最近有遇到项目需求,需要使用到 Nordic 的 nRF52xxx 芯片,还记得当初刚开始写博文的时候的写的 nRF52832 学习笔记,现在看当时笔记毫无逻辑可言,自己也不太看得懂,既然现在要正式开始用了,那么重新好好做些笔记。

刚开始,当然是要搭建好开发环境,因为已经习惯使用 gcc 环境,所以本文就来说说如何使用 GCC + Vscode 搭建 nRF52xxx 的开发环境 。

我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!

目录

  • 前言
  • 一、 安装 ARMGCC 和 VScode
  • 二、 下载 nRF5 SDK
    • 2.1 nRF5 SDK 和 softdevice
    • 2.2 Softdevice 的命名
  • 三、编译
    • 3.1 修改 Makefile 配置文件
    • 3.2 编译
  • 四、烧录
    • 4.1 下载 nRF Command Line Tools
    • 4.2 sdk_config
  • 结语

一、 安装 ARMGCC 和 VScode

因为 nRF52xxx 是 ARM 芯片,其实对于在 Windows 下使用 GCC 和 VScode 搭建 ARM 开发环境,我以前有一篇详细的博文,可以直接参考:

在window下使用 VScode 搭建 ARM 开发环境—— 详细版

最后只需要保证配置好环境变量,能够查到 arm-none-eabi-gcc 版本就表示配置好了:

在这里插入图片描述

详细步骤大家直接参考上面博文就好。

二、 下载 nRF5 SDK

nRF5 SDK 是 Nordic nRF5 系列产品的开发包,他包括了我们开发所需要的代码,我们可以从
Nordic 官网下载这个 SDK,下载链接如下: nRF5 SDK download

比如我们选择最新的 17.1.0 版本,

在这里插入图片描述

翻到最下面可以看到如下图示:

在这里插入图片描述

上图中,我发现虽然我只选择过 SDK_17.10 版本,但是到最下面,系统会自动推荐给你这么多 s112 类似的压缩包,这个我们待会详细说明,我们选中最后一项下载即可,下载后我们放到自己需要的位置,解压出来即可,如下图:

在这里插入图片描述

2.1 nRF5 SDK 和 softdevice

我们来解答一下上面那个问题,为什么选中的是nRF5 SDK 会出现官方会自动推荐那么多压缩包,那些 s112_nrf52_7.2.0.zip 是 Softdevice ,就是 Nordic 蓝牙协议栈的名称。

开发 Nordic 蓝牙芯片,我们需要知道 Nordic 的用户程序和协议栈是分开的,烧录的时候也需要分开烧录,这是区别与很多其他 MCU 的地方。

而且 Nordic 提供的协议栈,是以 hex 的形式提供给开发者的,如下:

在这里插入图片描述

那其实呢,对于我们下载的 nRF5 SDK 来说,里面已经包含了该版本支持的所有 softdevice,其存在于我们 SDK 解压后的 \components\softdevice 文件夹内,如下图:

在这里插入图片描述

那既然都包括 协议栈,为什么官方还会给我们推荐?

那是因为协议栈有时候会更新修复一些 bug,Nordic会把 bug 修复后的协议栈再以更高版本的方式发布出来,具体的 修复细节官方会有说明。

这里注意,大家更新协议栈的时候需要注意一下名字,如果以前用了某一版本的协议栈,需要更新新版本的协议栈,需要注意只下载最后一个位数字有变化的即可,比如用的 7.2.0,后续官方发布了7.2.1 ,我们可以直接下载覆盖以前的即可。 如果是前面的数值就有变化,那么两个版本的协议栈是不兼容的,需要进行其他的处理。

2.2 Softdevice 的命名

那既然聊到 Softdevice ,虽然与搭建环境无关,也浅浅了解一下把 。

以下内容出自 Nordic 中国区的 FAE:

  1. Softdevice 命名规则一:
    Softdevice包括两种底层协议栈:BLE和ANT,BLE包括两种角色:central(又称master)和peripheral(又称slave),为此需要给这些不同类型的协议栈进行命名区分。协议栈命名格式为Sxyz,其中

    x – 表示协议栈的类型,1表示BLE协议栈,2表示ANT协议栈,3表示同时支持BLE和ANT
    y – 表示BLE角色,1表示从设备,2表示主设备,3表示同时支持主设备和从设备
    z – 表示芯片类型,0表示nRF51系列,2表示nRF52系列
    比如S110,表示只支持从设备模式的nRF51 BLE协议栈
    比如S130,表示既支持从设备模式又支持主设备模式的nRF51 BLE协议栈
    比如S132,表示既支持从设备模式又支持主设备模式的nRF52 BLE协议栈
    比如S212,表示nRF52 ANT协议栈
    比如S332,表示nRF52既支持BLE协议栈又支持ANT协议栈,而且BLE协议栈既支持从设备模式又支持主设备模式

  2. Softdevice命名规则二:
    大体上跟命名规则1相同,但是协议栈编号最后2位跟芯片型号一样,比如S140,代表这个协议栈专门用于nRF52840。由于52840 Flash空间很大,没有必要做各种细分的协议栈,S140协议栈是一个大而全的协议栈,包含蓝牙所有功能。

三、编译

回到正题,我们的前面已经下载了 SDK ,我们继续修改一下配置,才可以正常的编译。

3.1 修改 Makefile 配置文件

我们在编译之前需要修改一下 SDK 中 Makefile 的配置,在你解压的路径\nRF5_SDK_17.1.0_ddde560\components\toolchain\gcc 中可以看到配置文件,在 windows 和 posix 线程操作系统下修改的文件是不同的,如下图:

在这里插入图片描述

本次测试使用的是 windows 系统,所以我把文件修改如下(下图有个错误):

在这里插入图片描述

上面 bin 后面少了一个斜杠 = =!,bin 后面的斜杠不要忽略。

3.2 编译

然后通过 VScode 打开 SDK,如下图,直接在 SDK 的根目录打开就可以:

在这里插入图片描述

然后在 VScode 里面打开中断,进入示例目录,我们下面进入的是 blinky 这个示例:

在这里插入图片描述

所以修改一下 Makefile.windows :

在这里插入图片描述

再次 make 一下,编译成功,生成 bin 文件和 hex 文件:

在这里插入图片描述

四、烧录

其实有了 hex 文件,如果使用的 J-Link 我们可以直接通过 J-Flash 进行烧录:

在这里插入图片描述

但是这样也是有点麻烦的,我们还记得开发 STM32 的时候,我们会在 Makefile 中中定义一些 .PHONY 伪指令用来烧录,如下图:

在这里插入图片描述

我们来看看 nRF5 SDK 环境中的 Makefile 是否有类似的指令,在 Makefile 的最后部分,我们可以看到相关指令:

在这里插入图片描述
我们试着看一下,当然不行:

在这里插入图片描述

我们可以看到 nrfjprog -f nrf52 --program $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex --sectorerase 明显是某个软件的指令,所以我们肯定还缺少这个烧录工具。

4.1 下载 nRF Command Line Tools

那上面缺少的工具呢,叫做nRF Command Line Tools ,官方下载地址:nRF Command Line Tools 下载地址

下载好后直接安装, 工具在安装过程中附带了SEGGER J-Link software , 因为本身做 ARM 开发的,电脑上如果有 SEGGER J-Link 可以选择不安装,但是有很多人建议最好是按照步骤全部安装。

我这里为了测试,就没有选择安装 SEGGER J-Link ,记住安装的时候最好是拔掉设备!

工具安装完成,本来还想着是不是也要添加环境变量,实际上安装的时候他自动就添加了,最后安装完成,根据我们以前一些工具的经验,我们可以通过 cmd 命令简单看一下:

在这里插入图片描述

这样我们就能使用 nrfjprog 命令了,我们回到工程,这里要注意! 工具安装好以后要重启一下 Vscode 才可以正常烧录,我们直接输入make flash ,可以看到可以正常烧录了 :

在这里插入图片描述

我们可以再测试一下,其他的伪指令,烧录协议栈,清除芯片,都是可以的,如下:

在这里插入图片描述

4.2 sdk_config

nRF5 SDK有一个非常重要的配置文件:sdk_config.h ,可以通过 sdk_config.h文件对整个芯片软件架构配置, 我们在 makefile 的最后可以看到有这个指令,说明我们也可以使用make sdk_config命令,如下图:

在这里插入图片描述

如果你不能想上图一样打开图形配置界面,那是因为你缺少 Java 运行环境,CMSIS Configuration Wizard是一个 Java 应用程序。

那具体文件如何使用,我们后面需要用到再说。

结语

到这里,我们已经可以对 nRF5 SDK 的示例进行编译烧录了,虽然好像我的测试板子程序没有跑起来 = =!

我们还有很多东西不清楚,接下来我们要做的是去认识 SDK 的工程结构,知道如何创建新工程,知道如何调试 ,一步一步来。

好了,本文就到这里,谢谢大家!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教学类-40-03】A4骰子纸模制作3.0(6.5CM嵌套+记录表)

作品展示 背景需求 骰子2.0(7字形)存在幼儿不会“包边”的问题,求助老师帮忙示范,最后累的还是老师 1.0版本,边缘折线多,幼儿剪起来费力。 2.0版本,边缘折线多,幼儿剪起来费力。&a…

基于开源项目OCR做一个探究(chineseocr_lite)

背景:基于图片识别的技术有很多,应用与各行各业,我们公司围绕电子身份证识别自动录入需求开展,以下是我的研究心得 技术栈:python3.6,chineseocr_lite的onnx推理 环境部署:直接上截图&#xff…

什么是ADC测试,能进行自动化测试吗?

ADC测试是一种电子测试方法,用于评估模拟-数字转换器的性能。ADC(模数转换器)是一种将模拟信号转换为数字信号的电子器件。在ADC测试中,会施加一个已知的模拟信号到ADC的输入端,然后测量其数字输出,通过比较输入信号和输出信号之间…

鸿蒙原生应用开发-DevEco Studio超级终端模拟器的使用

一、了解超级终端模拟器支持的设备情况 该特性在DevEco Studio V2.1 Release及更高版本中支持。 目前超级终端模拟器支持“PhonePhone”、“PhoneTablet”和“PhoneTV”的设备组网方式,开发者可以使用该超级终端模拟器来调测具备跨设备特性的应用/服务,如…

UnitTest 参数化---Parameterized安装

一、Parameterized安装命令 常见安装:pip install parameterized 或使用国内豆瓣镜像源安装:pip install parameterized -i https://pypi.douban.com/simple shell页面(安装页面cmd内) C:\Users\S3214>pip install paramete…

动态内存管理(上)

目录 为什么要有动态内存分配malloc和freemallocfree calloc和realloccallocrealloc 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸🥸 C语言 🐿️&…

gitblit 搭建本地服务器

gitblit 搭建本地的 git 服务器 一、简介 Gitblit是一个用于管理,查看和提供Git存储库的开源纯Java堆栈。它主要设计为希望托管集中式存储库的小型工作组的工具。 Gitblit 是一个和 Gitlab 、github、gitee 功能差不多的 git 远程仓库系统,Gitblit 开源免费、兼容性强、支持…

C++:this指针和构造与析构的运用

目录 一&#xff0c;this指针 二&#xff0c;构造函数 三&#xff0c;析构函数 四&#xff0c;析构与构造的调用 一&#xff0c;this指针 首先&#xff0c;我们先观察以下类&#xff1a; #include <iostream> using namespace std; class Date { public: void In…

二十、W5100S/W5500+RP2040树莓派Pico<MQTT连接阿里云控制板载LED>

1. 前言 物联网平台提供安全可靠的设备连接通信能力&#xff0c;支持设备数据采集上云&#xff0c;规则引擎流转数据和云端数据下发设备端。此外&#xff0c;也提供方便快捷的设备管理能力&#xff0c;支持物模型定义&#xff0c;数据结构化存储&#xff0c;和远程调试、监控、…

mindspore mindcv图像分类算法;模型保存与加载

参考&#xff1a; https://www.mindspore.cn/tutorials/en/r1.3/save_load_model.html https://github.com/mindspore-lab/mindcv/blob/main/docs/zh/tutorials/finetune.md 1、mindspore mindcv图像分类算法 import os from mindcv.utils.download import DownLoad import o…

举个栗子!Tableau 技巧(259):文本表中省市县数据的灵活逐级下钻「方法一」

之前&#xff0c;我们分享过 &#x1f330;&#xff1a;实现地图中的省市县逐级下钻。有数据粉提出问题&#xff1a;如果不是地图&#xff0c;而是文本表&#xff0c;有什么办法可以像这样&#xff0c;实现地理位置逐级下钻呢&#xff1f; 文本表也是可以的。但是&#xff0c;…

Count-based exploration with neural density models论文笔记

Count-based exploration with neural density models[J]. International Conference on Machine Learning,International Conference on Machine Learning, 2017. 基于计数的神经密度模型探索 0、问题 这篇文章的关键在于弄懂pseudo-count的概念&#xff0c;以及是如何运用…

【Leetcode】202. 两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

Java 身份证号校验,根据身份证号识别出生地

Java 身份证号校验&#xff1a; import org.apache.commons.lang.StringUtils;import java.util.Calendar; import java.util.Collections; import java.util.HashMap; import java.util.Map;/*** desc 身份证工具类* auth llp* date 2022/7/7 16:13*/ public class IdCardNum…

Java算法(三): 判断两个数组是否为相等 → (要求:长度、顺序、元素)相等

Java算法&#xff08;三&#xff09; 需求&#xff1a; 1. 定义一个方法&#xff0c;用于比较两个数组是否相同2. 需求&#xff1a;长度&#xff0c;内容&#xff0c;顺序完全相同package com.liujintao.compare;public class SameArray {public static void main (String[] a…

JAVA微信端医院3D智能导诊系统源码

医院智能导诊系统利用高科技的信息化手段&#xff0c;优化就医流程。让广大患者有序、轻松就医&#xff0c;提升医疗服务水平。 随着人工智能技术的快速发展&#xff0c;语音识别与自然语言理解技术的成熟应用&#xff0c;基于人工智能的智能导诊导医逐渐出现在患者的生活视角中…

小红书达人投放比例是多少合适?品牌方必看

品牌做小红书种草推广想要产生更好的效果&#xff0c;是需要素人和达人按照一定比例去进行投放的&#xff0c;素人铺量可以让产品产生迅速曝光的效果&#xff0c;少量达人投放可以让产品产生更好的转化效果。 小红书达人投放具有较高的互动性和口碑传播效果。达人通过自身的影…

打开pr提示找不到vcomp100.dll无法继续执行代码怎么办?5种dll问题解决方案全解析

vcomp100.dll是一个由Microsoft开发的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它对于许多基于图形的应用程序&#xff08;如Photoshop&#xff09;和多个游戏&#xff08;如《巫师3》&#xff09;至关重要。以下是关于vcomp100.dll的属性介绍以及找不到vcomp100…

小程序如何部署SSL证书

微信小程序开发前提必须拥有一本SSL证书&#xff0c;办理SSL证书之前确保好指定的微信小程序开发接口使用的域名&#xff0c;如果没有域名的提前申请好&#xff0c;并且到国内服务器提供商去办理备案。 了解微信小程序使用SSL证书的作用&#xff0c;包括以下三个方面&#xff1…

[C语言基础]文件读取模式简析

文件操作 打开方式介绍r / rb模式w / wb模式 打开方式介绍 函数fopen可打开一个文件&#xff0c;返回值是文件指针FILE * 第一个参数是文件路径&#xff0c;第二个参数是打开方式mode 参数可为以下几种&#xff1a; r/w/a/r/w/a/rb/wb/ab/rb/wb/ab 其中&#xff0c; r 为只读&…