系统环境

  • 系统:macOS 10.13.6(Windows 和 Linux 同样适用)
  • 网络:联网

软件环境(只能保证这个版本环境好用)

  • 编译器环境:SEGGER Embedded Studio v3.40(SES)
  • 仿真器驱动:J-Link Software and Documentation Pack v6.32i
  • 软件开发包:nRF5 SDK v12.3.0(最后一个支持 nRF51 系列芯片的版本)

硬件环境

  • 开发板:nRF51 DK v1.2.0
  • 开发板:青风 nRF51822 开发板
  • 仿真器:J-Link v9.2(淘宝版)(实测第三方 J-Link for ARM OB v7 不能长时间仿真)

导入 Keil µVersion 工程

  • 尽管 SES(SEGGER Embedded Studio)已经成为 Nordic 官方推荐的免费跨平台开发环境,但是首个获得官方支持带有 SES 工程的 SDK 版本是 v14.1.0,并不包括 nRF51 系列代码。因此对于 nRF51 系列来说,需要通过简单的操作将 Keil 工程转换为 SES 工程。
  • 打开 SES,在菜单栏选择“Tool -> Package Manager”,然后安装“CMSIS-CORE Support Package”和“nRF CPU Support Package”。

  • 在菜单栏,选择“File -> Import Project -> Import Keil MDK Project…”;
  • 导航到 nRF5 SDK 的位置,在路径“examples/ble_peripheral/ble_app_hrs/”中选择一个工程,例如:“pca10028/s130/arm5_no_packs/ble_app_hrs_pca10028_s130.uvprojx”。
  • 选中后,“Import Build Configuration”窗口会弹出,基于完全使用 SES 的目的,此处选择“Internal Toolchain (GCC/Clang)”,点击“OK”按钮,工程将被导入。

调整工程配置

  • 右键点击左侧导航窗口中的工程名,选择弹出菜单中的“Build Configurations…”;
  • 在“Public Configurations”栏录下选中“flash_s130_nrf51_2.0.1_softdevice”;

  • 点击右上方的“-”号删除这个配置并确定,此时导航栏上方将只剩“nrf51422_xxac”这一个配置。

添加 nRF5 MDK 文件

  • Keil µVersion 使用“Device Packs”用于系统启动文件,包含如系统启动汇编文件“arm_startup_nrf51.s”和系统设置文件“system_nrf51.c”,在 SES 中需要手动添加这些文件。下载文件“ses_nrf51_startup.s”(CSDN 国内路径资源);
  • 在 SDK 目录中,找到路径“components/toolchain/”,在这里新建文件夹“ses”,然后将下载好的“ses_nrf51_startup.s”文件放置在“ses”文件夹中;
  • 回到 SES 界面,在导航窗口中找到“Internal Files”目录,删除该目录下的“Cortex_M_Startup.s”文件(右键点击该文件并选择“Remove”);
  • 选中“Internal Files”目录,点击右键弹出菜单,选择“Add Existing File…”,通过这种方式分别添加 SDK 路径下的“components/toolchain/system_nrf51.c”和“components/toolchain/ses/ses_nrf51_startup.s”两个文件。

  • 在导航窗口选中工程名,点击右键弹出菜单选择“Edit Options…”,然后选择“Preprocessor”选项卡;
  • 找到“User Include Directories”项目,将路径“../../../../../../components/device”添加进去;

配对管理器暨 FLASH 存储器调整

  • 在 SDK 目录中找到工程目录“examples/ble_peripheral/ble_app_hrs/pca10028/s130/arm5_no_packs”,在该目录下用文本编辑器创建文件“flash_placement.xml”;
  • 回到 SES 界面,在导航窗口中点击右键弹出菜单,选择“Import Section placement”选项,此时弹出警告窗口,选择“Yes”,再“Yes”,在文件中输入如下内容并保存:
<!DOCTYPE Linker_Placement_File>
<Root name="Flash Section Placement"><MemorySegment name="$(FLASH_NAME:FLASH)"><ProgramSection alignment="0x100" load="Yes" name=".vectors" start="$(FLASH_START:)" /><ProgramSection alignment="4" load="Yes" name=".init" /><ProgramSection alignment="4" load="Yes" name=".init_rodata" /><ProgramSection alignment="4" load="Yes" name=".text" /><ProgramSection alignment="4" load="Yes" name=".dtors" /><ProgramSection alignment="4" load="Yes" name=".ctors" /><ProgramSection alignment="4" load="Yes" name=".rodata" /><ProgramSection alignment="4" load="Yes" name=".ARM.exidx" address_symbol="__exidx_start" end_symbol="__exidx_end" /><ProgramSection alignment="4" load="Yes" runin=".fast_run" name=".fast" /><ProgramSection alignment="4" load="Yes" runin=".data_run" name=".data" /><ProgramSection alignment="4" load="Yes" runin=".tdata_run" name=".tdata" /><ProgramSection alignment="4" keep="Yes" load="Yes" runin=".fs_data_run" name=".fs_data" /></MemorySegment><MemorySegment name="$(RAM_NAME:RAM);SRAM"><ProgramSection alignment="0x100" load="No" name=".vectors_ram" start="$(RAM_START:$(SRAM_START:))" /><ProgramSection alignment="4" load="No" name=".fast_run" /><ProgramSection alignment="4" load="No" name=".data_run" /><ProgramSection alignment="4" load="No" name=".tdata_run" /><ProgramSection alignment="4" load="No" keep="Yes" name=".fs_data_run" address_symbol="__start_fs_data" end_symbol="__stop_fs_data" /><ProgramSection alignment="4" load="No" name=".bss" /><ProgramSection alignment="4" load="No" name=".tbss" /><ProgramSection alignment="4" load="No" name=".non_init" /><ProgramSection alignment="4" size="__HEAPSIZE__" load="No" name=".heap" /><ProgramSection alignment="8" size="__STACKSIZE__" load="No" place_from_segment_end="Yes" name=".stack" /><ProgramSection alignment="8" size="__STACKSIZE_PROCESS__" load="No" name=".stack_process" /></MemorySegment><MemorySegment name="$(FLASH2_NAME:FLASH2)"><ProgramSection alignment="4" load="Yes" name=".text2" /><ProgramSection alignment="4" load="Yes" name=".rodata2" /><ProgramSection alignment="4" load="Yes" runin=".data2_run" name=".data2" /></MemorySegment><MemorySegment name="$(RAM2_NAME:RAM2)"><ProgramSection alignment="4" load="No" name=".data2_run" /><ProgramSection alignment="4" load="No" name=".bss2" /></MemorySegment>
</Root>
  • 在导航窗口中,找到“Internal Files”目录下的“thumb_crt0.s”,在“tdata”字段后加入“fs_data”字段:
ldr r2, =__tdata_end__
bl memory_copy
# ADD HERE ...
ldr r0, =__fs_data_load_start__
ldr r1, =__fs_data_start__
ldr r2, =__fs_data_end__
bl memory_copy
# TO HERE ...

构造(Building)

  • 现在可以构造成功了,右键点击工程名,在弹出菜单中选择“Build”,构造成功如下:

  • 此时 FLASH 和 SRAM 的起始还都是0地址,而 SoftDevice 的空间需要被留出来,所以需要配置空间。还是在导航窗口的工程名中右键选择“Edit Options…”,找到“Linker”选项卡;
  • 找到“Section Placement Macros”选项,添加宏定义(SRAM起始地址可调):
FLASH_START=0x1B000
SRAM_START=0x20002A10
  • 右键点击工程名,在弹出菜单中选择“Rebuild”,重构成功如下:

微调

  • 在导航窗口选中工程名,点击右键弹出菜单选择“Edit Options…”,然后选择“Preprocessor”选项卡;
  • 找到“Preprocessor Definitions”选项,添加宏定义“NO_VTOR_CONFIG”(这是为了告知 SES 为 SoftDevice 预留向量表的位置);

连同应用烧录 SoftDevice

  • 在导航窗口选中工程名,点击右键弹出菜单选择“Edit Options…”,然后选择“Loader”选项卡;
  • 找到“Additional Load File[0]”选项,添加 SoftDevice 的相对路径“../../../../../../components/softdevice/s130/hex/s130_nrf51_2.0.1_softdevice.hex”;
  • 再次运行重构。

运行

  • 使用 nRF51-DK 的话不需要更改设置,如果使用其他板子,如我正用的青风电子的板子上的芯片是 nRF51822QFAA,因此要在设置中更改芯片配置,否则无法运行;
  • 在导航窗口选中工程名,点击右键弹出菜单选择“Edit Options…”,然后选择“Debugger”选项卡;
  • 找到“Target Device”选项,选择自己正在使用的芯片,此处选择“nRF51822_xxAA”;

  • 将 nRF51 DK 或自己的板子通过 J-Link 连接到 Mac,确保板子电源供电正常;
  • 在菜单栏,选择“Build -> Build and Run”,可以看到板子灯亮了,确认已经在运行。

  • 通过手机软件 nRF Connect 也能搜索到来自开发板的信号,说明开发板确实在工作了。

调试

  • 在菜单栏,选择“Debug -> Go”,SES 界面变为调试状态,点击左上方的运行按钮,即可开始调试。

  • 在行号旁边点击,可以添加断点。SES 是配套 J-Link 的官方调试软件,所以其他专业软件有的功能 SES 都能做到,至此,环境搭建完成。

nRF51822:在 macOS 下使用 SEGGER Embedded Studio(SES)搭建开发环境相关推荐

  1. nRF52832:在 macOS 下使用 SEGGER Embedded Studio(SES)搭建开发环境

    系统环境 系统:macOS 10.14.5(Windows 和 Linux 同样适用) 网络:联网 软件环境 编译器环境:SEGGER Embedded Studio v4.16(SES) 镜像烧录器 ...

  2. HPM6750系列--第五篇 使用Segger Embedded Studio for RISC-V开发环境

    一.目的 之前的博文中<HPM6750系列--第四篇 搭建Visual Studio Code开发调试环境>我们介绍了如何使用visual studio code进行开发调试,但是用起来总 ...

  3. genymotion+android studio Android 搭建开发环境

    2019独角兽企业重金招聘Python工程师标准>>> 鉴于前段时间接到关于公司移动版OA的项目开发需求,在本机上搭建了一个Android的开发环境.(竟然搞了两天,在windows ...

  4. 华大 MCU 之六 SEGGER Embedded Studio 及 Ozone 使用 Jlink 调试

      首先说一下,我之前的开发流程是:VSCode 编辑代码 + Keil 编译及调试.Keil 的调试功能虽然很强大,但是多数功能需要配合 ARM 自家的 ULINKpro 才可以用,例如 Perfo ...

  5. 【C++ 语言】Visual Studio 配置 FFMPEG 开发环境 ( VS2019 CMake 环境安装 | 下载 FFMPEG 开发包 | 配置 FFMPEG )

    文章目录 Visual Studio 2019 社区版 CMakeList 开发环境安装 创建 FFMPEG 配置项目 FFMPEG 开发包下载 FFMPEG 头文件 静态链接库 ( .lib ) 动 ...

  6. nRF52832:使用 SEGGER Embedded Studio(SES)创建库文件

    系统环境 系统:macOS 11.2 网络:联网 软件环境 编译器环境:SEGGER Embedded Studio v5.40(SES) 镜像烧录器:nRF Connect v3.6.1 仿真器驱动 ...

  7. Getting Started with STM32 in Segger Embedded Studio

    初识Segger Embedded Studio(SES) 第一次见SES是在"安富莱电子论坛"上,"硬汉"提到SES的一些特性,再加上Jlink的大名,于是试 ...

  8. 用SEGGER Embedded Studio(SES)开发蓝牙nRF52840

    0. 准备 WIN10电脑一台 nrf52840开发板一套(其实如果基本蓝牙功能的话,nrf52832也行,有更小的成本).nrf52840集成了2.4GHz的各种协议,但还是蓝牙功能比较完善. 仿真 ...

  9. Segger Embedded Studio 软件下载和工程配置

    软件下载 Embedded Studio下载地址:https://www.segger.com/downloads/embedded-studio/ 下载完主程序,还需要在官网下载待开发器件对应的库函 ...

最新文章

  1. 算法 - 时间复杂度
  2. 2018.08.27 lucky(模拟)
  3. mysql的odbc连接字符串_MySQL :: linux ODBC连接mysql
  4. 深入掌握JMS(六):消息头
  5. get pid and kill
  6. 安卓-04-实例01-XML布局UI界面
  7. BugkuCTF-MISC题又一张图片,还单纯吗
  8. ul c语言,IMX6UL裸机实现C语言蜂鸣器实验
  9. Eclipse自定义文档注释和方法注释
  10. 美检方或起诉刘强东;百度对呛微信规则;澳洲调查 Facebook | 极客头条
  11. 如何解决MFC读取文件在EditControl中显示是乱码的问题
  12. HTML常用的标签总结
  13. 在c语言中字母是几个字节的,在c语言中int占几个字节
  14. vab宏与数据据笔记一(启用宏)
  15. TP6 接口返回三要素
  16. 吉尼斯官方确认火狐首日下载世界记录
  17. ceph存储 ceph集群Paxos算法实现
  18. 实例分析SQL中除法的三种写法
  19. 计算机大数据的前景方向_研究未来计算机大数据的发展方向
  20. 关于国土空间交通专项规划体系框架与编制要点的思考

热门文章

  1. GAZEBO 中 sdf文件详解
  2. ghost手动恢复linux,GHOST手动还原重装系统详细教程(图文)
  3. 【iuap5.0特性解读】用友云数据中台 直抵企业数字化的核心
  4. Linux下根目录文件说明
  5. 计算机网络:网络安全(网络支付安全)
  6. CSS基础:CSS的上下文之BFC
  7. 法拉第效应维尔德常数_(5)法拉第效应
  8. 百度算法——绿萝算法2.0
  9. 数据挖掘项目——新零售无人智能售货机商务数据分析
  10. 转:德鲁克:教育的产物是什么