一、SDK下载
下载页地址:
https://www.nordicsemi.com/Software-and-Tools/Software/nRF5-SDKwww.nordicsemi.com点击右边那个图标就可以下载了,不过这个链接有点慢,往下拉
点击"Compatibale downloads"选项卡,再往下拉
这里把其他三个softdevice勾掉只留下sdk,点击下载,这个下载是比较快的。
二、SDK目录结构
解压后就是这个样子,关于目录说明,没有,因为我还没完全搞明白
三、创建工程目录
想要学会创建一个工程,最快速的方法就是找个例子复制过来
这里我们要找单片机编程的hello world——led闪烁
examples目录下有很多例子
关于这些目录是啥意思,抱歉我还没搞明白,但是peripheral这个目录显然是外设相关的例子,我们要的led闪烁例程很有可能会在这里
打开一看果然在这里,有四个blinky目录,选哪个呢,老规矩,三长选一短,就选blinky目录
先不管blinky目录里边有什么,先把它复制到我们喜欢的地方,比如说SDK根目录,因为以后命令行操作会很方便
复制完之后,SDK根目录就是这个样子
以后呢SDK目录就可以作为我们的项目根目录来使用了
四、工程管理
工程目录创建完了,那么如何管理我们的工程呢
GNU/Linux系统中有很多项目管理工具,比如gnu make、cmake、qmake等等,那么NRF5_SDK用什么管理工程呢
打开blinky目录
只有一堆目录、main.c源码文件,还有一个blinky.eww,这个一看就是IAR的工程文件,显然不是我们想要的,hex目录里边是一堆编译好的二进制文件,跟工程管理也没有什么关系,剩下的四个目录长得好像,这里我们打开第pca10040(不用想了,这个就是right one,四个目录代表不同的开发板,开发板MCU不同)
又有三个目录(SDK目录这么深,不简化一下,命令行操作起来肯定会累死),mbr和s132目录还不清楚是什么东西,只剩下一个blank目录了,“空”没准就是干干净净的led闪烁程序了
打开一看又是一堆目录,真是怕了你了,耐心分析一下,很明显每个目录代表不同的编译器,这里我们选择armgcc也就是arm-none-eabi-gcc
翻了这么深的目录,差点忘记本节的目的什么了,提醒一下,我们要找NRF5_SDK用的是什么工程管理工具,好了看到Makefile了吧,很明显是用的gnu make,blinky_gcc_nrf52.ld是链接脚本文件,将来编译的时候链接用的,_build目录可以假装没看到
这么深的目录结构显然不是我们想要的,再简化一下吧
这个就是blinky目录最终的样子了,等等,sdk_config.h是哪里来,跳到上上个图片(抱歉,没有图编号)有个config目录,sdk_config.h头文件就在里边,一看就跟SDK配置相关,暂时先不管它,它不是本文的关键。
五、倒数第二节
工程目录简化完了,我们也知道要用gnu make管理工程了
那么不如
make一下
虽然我们知道极有可能编译不过,但是我们还是要试试,因为一直改来改去太枯燥了,我们要让机器做点事情了。
神奇的事情发生了,编译通过了,真的难以置信
难以置信就对了,编译成功是因为我的Makefile改过了
现实是这样的
看到了吗,目录不对
我们打开Makefile一点一点分析
PROJECT_NAME := blinky_pca10040
TARGETS := nrf52832_xxaa
OUTPUT_DIRECTORY := _build
SDK_ROOT := ../../../../../..
PROJ_DIR := ../../..
$(OUTPUT_DIRECTORY)/nrf52832_xxaa.out:
LINKER_SCRIPT := blinky_gcc_nrf52.ld
前三行分别定义了工程名、目标文件名、输出文件目录
重点是下边两个变量,SDK_ROOT显然是../,PROJ_ROOT为./
最后指定了链接脚本文件
改完之后再编译一次
失败,找不到编译器,显然是Makefile指定了编译器目录,然后找不到了
讲了半天的搭建开发环境,编译器都没装,失败
nRF52832是arm cortex-m4f内核的,所以我们要安装arm-none-eabi-gcc
下载地址:
GNU Toolchain | GNU-RM Downloads – Arm Developerdeveloper.arm.com下载后解压到那里随便你
前面说道Makefile指定了编译器的,让我们看看到底是在哪里指定的
打开Makefile,好了不卖关子了,剧透一下,这个Makefile是找不到的,那怎么办
TEMPLATE_PATH := $(SDK_ROOT)/components/toolchain/gcc
include $(TEMPLATE_PATH)/Makefile.common
在130行左右可以看到有个include,显然它包含了Makefile.common这个Makefile,当前Makefile找不到的当然去include的Makefile里边去找,顺着路径找到Makefile.common
# Toolchain commands
CC := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-gcc)
CXX := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-c++)
AS := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-as)
AR := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-ar) -r
LD := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-ld)
NM := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-nm)
OBJDUMP := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-objdump)
OBJCOPY := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-objcopy)
SIZE := $(call quote,$(GNU_INSTALL_ROOT)$(GNU_PREFIX)-size)
可以看到,在119行指定了编译器,但是GNU_INSTALL_ROOT,GNU_PREFIX这两个变量的值我们依然不知道,前面说过了,当前文件找不到的就去包含的(或者被包含的)Makefile找
PLATFORM_SUFFIX := $(if $(filter Windows%,$(OS)),windows,posix)
TOOLCHAIN_CONFIG_FILE := $(TEMPLATE_PATH)/Makefile.$(PLATFORM_SUFFIX)
include $(TOOLCHAIN_CONFIG_FILE)
在112行又包含了一个Makefile,这个文件叫做TOOLCHAIN_CONFIG_FILE,它的值是$(TEMPLATE_PATH)/Makefile.$(PLATFORM_SUFFIX)
上面我们已經知道TEMPLATE_PATH就是现在的目录,因为我们是顺着它找过来的,
那么我么再看PLATFORM_SUFFIX这个变量,什么意思呢,就是检测当前平台是windows还是posix,可以了解一下什么是posix,我使用的是ubuntu,所以这个文件就是本目录下的Makefile.posix
GNU_INSTALL_ROOT ?= /usr/local/gcc-arm-none-eabi-6-2017-q2-update/bin/
GNU_VERSION ?= 6.3.1
GNU_PREFIX ?= arm-none-eabi
这里指定了编译器的目录以及版本,这个需要根据你自己的安装目录和编译器版本去修改
GNU_INSTALL_ROOT ?= /usr/gcc-arm-none-eabi/bin/
GNU_VERSION ?= 8.2.1
GNU_PREFIX ?= arm-none-eabi
我安装在了/usr/gcc-arm-none-eabi/目录,版本是8.2.1
改完之后回到blinky目录,make一下,可以看到终于编译成功了,那么程序能不能用呢
六、最后一节
怎么烧写程序呢,总不能回到windows系统烧写吧,那岂不是太讽刺了
很简单Makefile里边就有烧写程序的target
# Flash the program
flash: default
@echo Flashing: $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex
nrfjprog -f nrf52 --program $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex --sectorerase
nrfjprog -f nrf52 --reset
erase:
nrfjprog -f nrf52 --eraseall
有两个target,flash就是烧写程序,erase就是擦除flash,可以看到,这两个target都是调用nrfjprog实现的,所以一定要安装nrfjprog
下载页地址:
nRF5 Command Line Tools - Downloadswww.nordicsemi.com解压,然后设置环境变量
然后连接好硬件,执行make flash就可以把led闪烁程序下载到开发板了
由于引脚选择的原因,可能你的开发板并不会看到led闪烁