雷竞技注册
项目

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

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

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

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

概述

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

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

硬件

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

安装软件

GCC的手臂

下载安装程序以获取各自的操作系统。按照屏幕上的说明进行操作。选中“添加到系统路径”的框。请注意安装在位置的位置,因为它将在编写makefile时稍后使用。

Segger J-Link

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

安装

将J-Link添加到系统路径

GnuWin32 Make和Coreutils

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

北欧SDK.

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

基本项目设置

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

眨眼睛

要闪烁LED,您只需要创建三个文件。对于此项目,除了定义微控制器寄存器之外,SDK将不会依赖。为项目创建一个新文件夹,并在目录中创建文件“main.c”,“gcc_blank_nrf51.ld”和“makefile”。或者下载zip文件并将它们提取到项目文件。

LED_EXAMPLE.ZIP.

main.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(。)组(-lgcc -lc -lnosys)内存{flash(rx):origh = 0x0,长度= 0x40000 RAM(RWX):Origal = 0x20000000,Length = 0x8000}}包括“gcc_nrf51_common.ld”

makefile

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

project_name:= blink_led #path变量,自定义为您的系统sdk_path = c:/ nrf51_sdk output_binary_directory:= _build gnu_install_root = c:/程序文件(x86)/ gnu tools arm嵌入式/ 4.9 2015q1 #setup构建目录object_directory = _build listing_directory = $(object_directory)output_binary_directory = $(object_directory)build_directorize:= $​​(sort $(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库。

#compile flags cflags = -dnrf51 cflags + = -mcpu = cortex-m0 cflags + = -mthumb -mabi = aapcs --std = gnu99 cflags + = -wall -werror -o3 cflags + = -mfloat-abi = soft #peast单独部分中的每个功能。这将允许链接器转储未使用的函数cflags + = -ffunction-sections -fdata-sections -fno-strict-aliasing cflags + = -fno-build --short-enums #linker标志#在单独的部分保持每个函数。这将允许Linker转储未使用功能导出输出_filename ldflags + = -xlinker -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版本ldflags + = --specs = nano.specs  -LC -LNOSYS#汇编程序标志ASMFLAGS + = -X汇编程序 - 带 -  CPP ASMFLAGS + = -DNRF51

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

使用SDK中的示例

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

使用softdevice.

这里唯一的大区别是在构建过程中使用的链接脚本。要测试是否可以构建,请转到[SDK文件夹] examples \ ble_peripheral \ ble_app_hrs \ pca10031 \ s110 \ armgcc和类型“make”。该项目是一个心率传感器,您可以连接到手机并查看假心率数据。对于未来文章中的所有BLE项目,我们将使用SoftDevice链接器脚本编译,因为我们将始终使用BLE堆栈。如果使用使用SoftDevice Linker脚本构建的应用程序,则NRF51必须安装软文件。

下载使用JTAG

北欧有一个叫做nRFgo的工具,它有一个下载代码的图形界面。不过,该应用程序仅适用于Windows。如果您想从命令行下载软件,您可以使用北欧的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. 在软设备十六进制文件所在文件夹的命令提示符中执行以下命令。这假设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 >> eraseall.jlink @echo w4 4001e514 1 >> eraseall.jlink @echo睡眠100 >> eraseall.jlink @echo r >> eraseall.jlink @Echo Exit >> Eraseall.jlink jlink -device nrf51422_xxac -speed 4000 -commanderscript eraseall.jlink @echo w4 4001e504 1> nrf51_program_sd.jlink @echo loadbin s110_softdevice.bin 0 >> nrf51_program_sd.jlink @echo r >> nrf51_program_sd.jlink @echog >> nrf51_program_sd.jlink @echo退出>> nrf51_program_sd.jlink jlink -device nrf51422_xxac -speed 4000 -commanderscript nrf51_program_sd.jlink

下一篇文章串联:BLE using nRF51:创建BLE外设

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