nRF51822:在 macOS 下使用 Segger Embedded Studio (SES) 搭建開發環境

系統環境

  • 系統:10.13.5(Windows和Linux同樣適用)
  • 網絡:聯網

軟件環境

  • 編譯器環境:Segger Embedded Studio v3.34b(SES)
  • 仿真器驅動:J-Link Software and Documentation Pack v6.22g
  • 軟件開發包:nRF5 SDK v12.3.0(最後一個支持nRF51系列芯片的版本)

導入 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 IAR EWARM / 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 都能做到,至此,環境搭建完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章