所有关于电路
项目

BLE使用nRF51: ARM-GCC构建环境

2015年9月14日通过特拉维斯Fagerness

如何使用makefiles和ARM-GCC为nRF51片上系统建立构建环境。

如何使用makefiles和ARM-GCC为nRF51片上系统建立构建环境。

概述

这是关于……的系列文章的一部分nRF51。nRF51是一种系统芯片,集Cortex M0和BLE无线芯片于一体。本文演示如何设置一个开放源码构建环境,并创建一个在nRF51系列微控制器上运行的简单应用程序。以后的文章将介绍创建自定义BLE外围设备、使用FreeRTOS以及控制其他设备。

软件运行在nRF51上由asoftdevice用户应用程序。的softdevice来自Nordic的二进制文件,提供了BLE功能。用户应用程序调用来自SoftDevice的函数,以便访问BLE功能和其他功能。本文中使用的所有工具可用于Windows,Linux或Mac。在制作本文期间使用Windows 10。以下是为NRF51构建软件所需的所有软件工具的列表。

硬件

  • 本文和其他项目都使用nRF51电子狗北欧。这个狗狗包括一个用于编程和调试的J-link连接。在北欧示例代码中称为PCA10031。任何基于nRF51的硬件平台都可以使用,但是编程时可能需要做一些修改。
  • GCC的手臂
  • 耐火JLINK
  • GnuWin32使
  • GnuWin32 CoreUtils
    • 如果您使用的是Linux,则没有必要这样做
    • v5.3.0
  • 北欧SDK

安装软件

GCC的手臂

下载相应操作系统的安装程序。请按照屏幕上的说明操作。选中“添加到系统路径”框。请记录安装的位置,因为稍后写入makefile时将使用它。

耐火J-link

下载安装程序并按照屏幕上的说明操作。选择安装USB驱动程序的选项。记录安装目录并将其添加到系统路径中。这可以在windows下通过进入控制面板->系统->高级系统设置->环境变量->在系统变量中选择路径->编辑->从安装中添加路径。

安装

将J-Link添加到系统路径

GnuWin32制造和Coreutils

按照屏幕上的说明安装make。将安装文件夹添加到系统路径,在我的例子中它是“C:\Program Files (x86)\GnuWin32\bin”。这样我们就可以从命令行访问“make”和其他工具。

北欧SDK

从Nordic Developer网站下载zip文件。将SDK解压到您选择的位置。请记住位置,因为稍后写入makefile时将使用它。我把我的放在C:\nrf51_sdk中。保持文件夹结构不变,这样您就可以在以后方便地更新SDK而不影响您的项目。

基本项目设置

Nordic SDK实际上在examples文件夹中有很多例子。其中一些支持makefile,但很多不支持。SDK也有很多库,使访问外设变得更容易。

眨眼睛

闪烁一个LED,你只需要创建三个文件。在这个项目中,除了定义微控制器寄存器外,不会依赖SDK。为项目创建一个新文件夹,并创建文件“main”。gcc_blank_nrf51 c”。”和makefile。或者下载zip文件并将其解压缩到项目文件中。

led_example.zip

c

以下代码将蓝色LED引脚设置为输出并打开和关闭它。LED引脚基于NRF加密狗的原理图定义。

#include“nrf51.h”#include“nrf51_bitfields.h”#define led_blue 23 #define led_gren 22 #define led_red 21 #define toggle_ticks 400000 int main(void){volatile uint32_t toggle_timer = toggle_ticks;/ *将蓝色LED配置为输出* / nrf_gpio-> pin_cnf [let_blue] =(gpio_pin_cnf_sense_disabled << gpio_pin_cnf_sense_pos)|(gpio_pin_cnf_drive_s0s1 << gpio_pin_cnf_drive_pos)|(gpio_pin_cnf_pull_disabled << gpio_pin_cnf_pull_pos)|(gpio_pin_cnf_input_disconnect << gpio_pin_cnf_input_pos)|(gpio_pin_cnf_dir_output << gpio_pin_cnf_dir_pos);/ *切换LED * / whist(1){toggle_timer--;if(toggle_timer == 0){/ *获取LED引脚的状态并切换它* / if((nrf_gpio-> out >> led_blue)&1ul)== 0){nrf_gpio-> OUTSET =(1UL < outclr =(1UL << LED_BLUE);} toggle_timer = toggle_ticks; } } }

链接器脚本

链接器脚本负责将编译后的代码放置在正确的内存区域中。下面的链接器脚本将应用程序放置在内存位置0。当我们为蓝牙应用程序使用软设备时,必须更改链接器脚本,以将应用程序放置在内存位置0x18000。

/*配置内存区域的链接器脚本。* / SEARCH_DIR(。)GROUP(-lgcc -lc -lnosys) MEMORY {FLASH (rx): ORIGIN = 0x0, LENGTH = 0x40000 RAM (rwx): ORIGIN = 0x20000000, LENGTH = 0x8000} INCLUDE "gcc_nrf51_common.ld"

makefile

Makefile负责定义编译器,链接器和其他各种项目设置。Nordic SDK附带了一个Makefile,我修改了一下。以下行是您特定系统的设置变量。此处定义了SDK和编译器的路径。

PROJECT_NAME: = blink_led #路径变量,系统定制SDK_PATH = C: / nrf51_sdk OUTPUT_BINARY_DIRECTORY: = _build GNU_INSTALL_ROOT = C: /程序文件(x86) / GNU工具ARM嵌入式/ 4.9 2015 q1 #设置构建目录OBJECT_DIRECTORY = _build LISTING_DIRECTORY = (OBJECT_DIRECTORY) OUTPUT_BINARY_DIRECTORY =美元(OBJECT_DIRECTORY) BUILD_DIRECTORIES: = $(排序(OBJECT_DIRECTORY)美元(OUTPUT_BINARY_DIRECTORY)美元(LISTING_DIRECTORY))

下一行定义了源文件,并包括项目的路径。如果要添加更多源文件,请在最后一个文件之后简单地添加“\”,并在源文件的位置和名称添加新行。可以以相同的方式添加包括路径。

#c源文件要编译,从项目中添加文件来编译此处c_source_files + = \ $(sdk_path)/ components/toolchain/system_nrf51.c \ main.c #assembly文件要编译ASM_Source_Files + = $(SDK_Path)/组件/工具链/ gcc / gcc_startup_nrf51.s #include paths inc_paths + = \ -i $(sdk_path)/ components / toolchain / gcc \ -i $(sdk_path)/ component / toolchain

下一行定义了编译器,汇编程序和链接器的标志。以下是您可以设置优化设置和其他GCC选项的位置。在此Makefile中使用newlib nano版本,该版本是为嵌入式系统定制的标准C库。

#编译标志CFLAGS = -DNRF51 CFLAGS += -mcpu=cortex-m0 CFLAGS += -mthumb -mabi=aapcs——std=gnu99 CFLAGS += -Wall -Werror -O3 CFLAGS += -mfloat-abi=soft #将每个函数单独放在一个section中。这将允许链接器转储未使用的函数CFLAGS += - function-sections -fdata-sections -fno-strict-alias CFLAGS += -fno-builtin——short-enums #link flags #将每个函数保存在单独的section中。这将允许链接器转储未使用的函数export OUTPUT_FILENAME LDFLAGS += - xlink -Map=$(LISTING_DIRECTORY)/$(OUTPUT_FILENAME)。map LDFLAGS += -mthumb -mabi=aapcs -L $(SDK_PATH)/components/toolchain/gcc -T$(LINKER_SCRIPT) LDFLAGS += -mcpu=cortex-m0 #让链接器转储未使用的节LDFLAGS += -Wl,——gc-sections #在nano版本中使用newlib LDFLAGS +=——specs=nanospecs -lc -lnosys #汇编标志ASMFLAGS += -x汇编带有-cpp ASMFLAGS += -DNRF51

最后,该文件的其余部分自动构建必要的文件以创建用于编程设备的十六进制文件。该文件的这一部分通常不需要修改。

使用来自SDK的示例

已经有一个例子利用SDK来闪烁PCA10031的LED。要使用这个例子,进入[SDK folder]examples\peripheral\blinky\pca10031\blank\armgcc并在控制台输入'make'。它的工作方式是有一个叫做nrf_gpio.h的驱动程序来处理所有的引脚设置。在“板子”中还有板子支持包文件。h”定义了所有的针各种demoboards从北欧。最后,驱动程序nrf_delay.h提供了许多函数来进行计时和繁忙等待。

使用Softdevice

这里唯一的区别是在构建过程中使用的链接器脚本。要测试你是否可以构建,进入[SDK folder]examples\ble_peripheral\ble_app_hrs\pca10031\s110\armgcc并输入'make'。这个项目是一个心率传感器,你可以连接到你的手机上,看到假的心率数据。对于未来文章中的所有BLE项目,我们将使用软设备链接器脚本进行编译,因为我们将一直使用BLE堆栈。如果使用使用软设备链接器脚本构建的应用程序,则必须在nRF51上安装一个软设备。

下载使用JTAG

有一个来自北欧的叫做nRFgo的工具,它有一个用于下载代码的图形界面。不过,该应用程序仅适用于Windows。如果希望从命令行下载软件,可以使用Nordic的Jlink Commander或nrfjprog。如果使用Jlink,则必须采取一些额外的步骤将内存编程到正确的位置,并正确设置某些寄存器。

计划应用程序

使用以下批处理文件从命令行编程应用程序。此批处理文件通过创建JLink脚本文件,然后使用JLink命令行程序执行它。它连接到目标处理器并将代码下载到应用程序存储位置。用要编程的文件替换“yourprogram.bin”。如果您未使用SoftDevice,请将第2行的文本“0x18000”更改为“0x0”。如果您的设备已在其上编程了SoftDevice,则必须在将应用程序写入存储位置0x0之前进行完整擦除,因为SoftDevice受到保护。

@echo off @echo loadbin yourpogram.bin 0x18000> nrf51_program_app.jlink @echo r >> nrf51_program_app.jlink @echo g >> nrf51_program_app.jlink @echo退出>> nrf51_program_app.jlink jlink -device nrf51422_xxac -speed 4000 -commanderscript nrf51_program_app.jlink

程序Softdevice

由于一些引导加载程序和保护寄存器的存在,编写软设备比应用程序更复杂。软设备十六进制文件必须使用objcopy转换成二进制文件。软设备位于[SDK]\components\softdevice\s110\hex\s110_softdevice.hex。执行以下命令将十六进制文件转换为两个单独的二进制文件:

  1. 在软设备hex文件所在文件夹的命令提示符中执行以下命令。这假设在系统路径中添加了arm-none-eabi-objcopy所在的文件夹。
    ARM-None-EABI-objcopy -iihex-obinary s110_softdevice.hex s110_softdevice.bin
  2. 执行以下批处理文件。您必须从上述文件所在的同一文件夹运行该脚本,或者修改脚本以指向文件的绝对位置。
@echo off @echo w4 4001e504 2 > eraseall。jlink @echo w4 4001e50c 1 >>擦除all。jlink @echo w4 4001e514 1 >> eraseall。@echo sleep 100 >> eraseall。@echo r >> eraseall。@echo退出>> eraseall。jlink jlink -device nRF51422_xxAC -speed 4000 -commanderscript eraseall。jlink @echo w4 4001e504 1 > nrf51_program_sd。s110_softdevice.bin 0 >> nrf51_program_sd. jlink @echo loadbin s110_softdevice.bin 0 >>jlink @echo r >> nrf51_program_sd。jlink @echo g >> nrf51_program_sd。jlink @echo exit >> nrf51_program_sd。jlink jlink -device nRF51422_xxAC -speed 4000 -commanderscript nrf51_program_sd.jlink

下一篇文章:使用nRF51创建BLE外围设备

为自己提供这个项目!BOM。