天天看點

NORDIC nrf52833使用筆記

文章目錄

    • 一、SoftDevice命名規則
      • (一)、通用規則
      • (二)、特定規則
    • 二、nRF52833關鍵特性
    • 三、SoftDevice目錄架構
    • 四、代碼目錄架構
    • 五、應用代碼結構
    • 六、記憶體配置設定表
      • (一)、不帶bootloader時的記憶體配置設定
      • (二)、帶bootloader時的記憶體配置設定
    • 七、外設舉例說明
      • (一)、GPIO
      • (二)、TWI(I2C/UART)
    • 八、移植不同型号DK
    • 九、參考文檔

剛開始可以先看這兩篇文檔,看懂了就不用看我寫的了 😃

nRF5 SDK軟體架構及softdevice工作原理

Nordic nRF5 SDK和softdevice介紹

一、SoftDevice命名規則

以Sxyz為例,其中S表示Software,各字母的含義如下所示。不同的協定棧的具體描述可見此處。

(一)、通用規則

x - 協定棧類型

  • 1:BLE stack
  • 2:ANT stack
  • 3:BLE&ANT stack

y - BLE角色

  • 1:peripheral role
  • 2:central role
  • 3:all roles(central/peripheral/advertiser/observer)

z - 系列晶片

  • 0:nRF51 series
  • 2:nRF52 series
  • 3:misc series

例如S113代表的是 低功耗BLE協定棧,從裝置,針對nRF52805, nRF52810, nRF52811, nRF52820, nRF52832, nRF52833 and nRF52840系列的SoC。

(二)、特定規則

x - 協定棧類型

同上

yz - 晶片型号

  • 40:針對晶片52840

tips: S140是一個大而全的協定棧,包含藍牙所有功能。

注意不同的softdevice所占用的ROM和RAM是不一樣的,具體看其手冊S112、S113、S122、S130、S132、S140、S212、S312、S332、S340…

NORDIC nrf52833使用筆記

圖1-1 s113屬性圖

NORDIC nrf52833使用筆記

圖1-2 s140屬性圖

二、nRF52833關鍵特性

  • 該SoC主頻為64MHz、核心為Arm Cortex-M4且帶FPU。
  • Flash大小為512KB,RAM大小為128KB。
  • 支援PHY為2 Mbps,1 Mbps, Long Range。
  • 支援藍牙定位功能。
  • 支援低功耗藍牙BLE、藍牙Mesh組網、ANT、NFC、Thread和Zigbee協定。
  • 發射功率最大為+8dBm。
  • 支援CCM(CTR加密模式和CMAC認證算法的混合)模式的128-bit AES加密。
  • 支援的外設有UART, SPI, TWI(Two Wire Interface), PDM, HS-SPI, I2S, PWM, 12-bit ADC, USB 2.0。

TWI就是雙線接口,支援類似I2C這種隻有時鐘線/資料線的協定。

三、SoftDevice目錄架構

目前最新的nRF5 SDK版本為17.02

NORDIC nrf52833使用筆記

圖3-1 nRF5 SDK17目錄架構

  • components:Nordic開發的各種SDK,隻包含頭檔案、源檔案以及庫檔案,切勿修改!
  • config:不同類型晶片的配置檔案。
  • documentation:SDK和不同softdeviceAPI的參考文檔。
  • examples:根據不同傳輸協定/BLE角色/外設等應用場景所設計的例程。此目錄很常用。
  • external:第三方庫或源碼。
  • external_tools:第三方工具。
  • integration:內建舊版本SDK(≤SDK14)的驅動(又稱legacy)。
  • modules:新版本SDK(>SDK14)驅動nrfx,同時支援nRF5 SDK(用于nRF51/52晶片)以及nRF Connect SDK(支援nRF91/53晶片)。

四、代碼目錄架構

以usbd_ble_uart為例,具體代碼位置在./examples/peripheral/usbd_ble_uart/s113。

NORDIC在此支援三種IDE,分别是Keil、IAR和SES(SEGGER Embedded Studio),我們用SES進行開發。注意SES一定要使用最新版,因為新版本的IDE是完全免費的,相關license到官網申請注冊即可。

NORDIC nrf52833使用筆記

圖4-1 代碼目錄圖

  • Application

    存放應用程式檔案,主要有main.c和sdk_config.h檔案。

    NORDIC nrf52833使用筆記

圖4-2 Application目錄圖

  • Board Definition

    此處主要包含開發闆相關硬體的定義,主要涉及的是各種闆載相關的外設。

NORDIC nrf52833使用筆記

圖4-3 Board Definition目錄圖

  • Board Support

    此處主要是提供系統狀态訓示(掃描、廣播、綁定、連接配接成功等)功能,根據系統狀态控制LED。以及提供通過按鍵控制系統狀态的功能(配對、斷開連接配接、喚醒等)。

    NORDIC nrf52833使用筆記

圖4-4 Board Support目錄圖

  • None

    存放與晶片相關的啟動檔案、系統時鐘配置檔案,此處在修改晶片的時候需要替換對應檔案。

    NORDIC nrf52833使用筆記

圖4-5 None目錄圖

  • nRF_BLE

    存放低功耗藍牙相關的廣播、建立連接配接、服務、連接配接上下文管理器和GATT等檔案。

    NORDIC nrf52833使用筆記

圖4-6 nRF_BLE目錄圖

  • nRF_BLE_Services

    存放NUS序列槽服務的檔案。

    NORDIC nrf52833使用筆記

圖4-7 nRF_BLE_Services目錄圖

  • nRF_Drivers

    存放外設驅動檔案。

    NORDIC nrf52833使用筆記

圖4-8 nRF_Drivers目錄圖

  • nRF_Libraries

    存放庫檔案,用于實作多種功能。

    NORDIC nrf52833使用筆記

圖4-9 nRF_Libraries目錄圖

  • nRF_Log

    存放日志輸出相關的檔案。

    NORDIC nrf52833使用筆記

圖4-10 nRF_Log目錄圖

  • nRF_Segger_RTT

    存放SEGGER RTT相關(Teal Time Transfer)檔案,和printf類似(但占用時間極短 us級),可多通道雙向傳輸調試資訊,需要使用軟體“J-Link RTT Viewer”。

    NORDIC nrf52833使用筆記

圖4-11 nRF_Segger_RTT目錄圖

  • nRF_SoftDevice

    存放協定棧相關的檔案。

    NORDIC nrf52833使用筆記

圖4-12 nRF_SoftDevice目錄圖

  • Segger Startup Files

    存放SEGGER啟動檔案。

    NORDIC nrf52833使用筆記

圖4-13 Segger Startup Files目錄圖

  • UTF/UTF16 converter

    存放UTF編碼轉換檔案。

    NORDIC nrf52833使用筆記

圖4-14 UTF/UTF16 converter目錄圖

  • Output Files

    存放編譯輸出檔案。

    NORDIC nrf52833使用筆記

圖4-15 Output Files目錄圖

五、應用代碼結構

主函數如下所示。

int main(void)
{
    ret_code_t ret;
    static const app_usbd_config_t usbd_config = { /* USB裝置配置結構體 */
        .ev_state_proc = usbd_user_ev_handler /* 注冊usb裝置使用者事件函數 */
    };
    // Initialize.
    log_init(); /* 初始化資訊輸出接口 */
    timers_init(); /* 初始化定時器,此處使用LED辨別BLE和CDC狀态 */

    buttons_leds_init(); /* 初始化按鍵和LED */

    app_usbd_serial_num_generate(); /* 生成usb裝置序列号 */

    ret = nrf_drv_clock_init(); /* 初始化裝置時鐘 */
    APP_ERROR_CHECK(ret); /* 檢測傳回值是否正常 */

    NRF_LOG_INFO("USBD BLE UART example started.");

    ret = app_usbd_init(&usbd_config); /* 傳入usb配置結構體初始化usb裝置 */
    APP_ERROR_CHECK(ret);

    app_usbd_class_inst_t const * class_cdc_acm = app_usbd_cdc_acm_class_inst_get(&m_app_cdc_acm); /* 擷取USB CDC-ACM執行個體  */
    ret = app_usbd_class_append(class_cdc_acm); /* USB裝置追加注冊CDC ACM類 */
    APP_ERROR_CHECK(ret);

    ble_stack_init(); /* 初始化協定棧 */
    gap_params_init(); /* 初始化GAP參數 */
    gatt_init(); /* 初始化GATT */
    services_init(); /* 初始化服務 */
    advertising_init(); /* 初始化廣播 */
    conn_params_init(); /* 初始化連接配接參數 */

    // Start execution.
    advertising_start(); /* 開始廣播 */

    ret = app_usbd_power_events_enable(); /* 使能usb裝置插入檢測 */
    APP_ERROR_CHECK(ret);

    // Enter main loop.
    for (;;)
    {
        while (app_usbd_event_queue_process()) /* 處理隊列事件 */
        {
            /* Nothing to do */
        }
        idle_state_handle(); /* 進入空閑模式,節省電量 */
    }
}
           

在應用中,我們主要修改的是傳輸速率相關的宏定義以及各種回調函數,其他大部分功能已經封裝好。

表5-1 與傳輸速度相關的宏定義表

parameter range default description
MTU(Maximun Transmission Unit) 23~247 23 最大傳輸單元
Data Length 27~251 251 最大資料長度
Connect Event Length - 400(*1.25 = 500ms) 連接配接事件長度
Connection Event Extension True/False True 連接配接時間拓展功能(延長)
PHY(physical layer) 1Mbps/2Mbps/Coded 1Mbps 實體層協定,其中coded protocol僅限于nRF52840

表5-2 各回調函數表

函數名 函數說明 函數作用
cdc_acm_user_ev_handler CDC ACM回調函數 處理USB序列槽端口開啟/關閉/發送/接收等事件
nus_data_handler BLE序列槽服務回調函數 處理BLE序列槽服務發送/接收/notification開啟或停止等事件
on_adv_evt 廣播事件回調函數 處理廣播事件
ble_evt_handler ble事件回調函數 處理GAP連接配接/斷開/請求/逾時等事件
gatt_evt_handler gatt事件回調函數 處理GATT MTU和資料長度更新請求完畢等事件
bsp_event_handler 底層事件回調函數 處理系統休眠/GAP斷開連接配接/關閉白名單/綁定/複位等事件
usbd_user_ev_handler usb使用者事件回調函數 處理USB裝置端點挂起/恢複/開啟/停止和插入檢測等事件

六、記憶體配置設定表

Nordic nRF5系列晶片使用的flash存儲器是NOR flash,程式代碼無須加載到RAM就可直接在flash上執行。Nordic Flash是帶cache機制的,以保證大部分代碼執行速度可以達到64MHz,在cache失敗的時候,等待周期也隻有1個cycle。另外,Nordic晶片是純Flash産品,裡面沒有其他NVM(Non-Volatile Memory),所有非易失性資料都放在Flash中,包括藍牙協定棧,這也是為什麼Nordic藍牙協定棧也可以OTA的根本原因所在。
NORDIC nrf52833使用筆記

圖6-1 nRF52833晶片記憶體分布圖

(一)、不帶bootloader時的記憶體配置設定

表6-1 不帶bootloader時記憶體配置設定表

記憶體位址 區塊
Application_size + SoftDevice_size
Application
SoftDevice_size
SoftDevice
0x00000000

SoftDevice_size根據不同的Softdevice進行配置

(二)、帶bootloader時的記憶體配置設定

此圖詳見官網bootloader memory map

NORDIC nrf52833使用筆記

圖6-2 帶bootloader時不同晶片不同softdevice的記憶體配置設定圖

NORDIC nrf52833使用筆記

圖6-3 記憶體劃配置設定置圖

注意,S140的大小為0x1C000,表格上面SoftDevice的位址範圍是錯誤的(應該為0x0000 1000-0x0001 D000)。

七、外設舉例說明

各外設的API說明請看SDK離線文檔

//IO映射,如P1.12 --> NRF_GPIO_PIN_MAP(1, 12)
#define NRF_GPIO_PIN_MAP(port, pin) (((port) << 5) | ((pin) & 0x1F))
           

下面舉例說明GPIO和TIMER如何使用,在哪找相關API。其實最好的方法就是看examples/peripheral裡面相關外設的demo,簡單快速上手。

(一)、GPIO

打開examples/peripheral/blinky/pca10040/s132/ses目錄下的emProject項目。

1、配置為輸出模式

  • 初始化函數
NORDIC nrf52833使用筆記

圖7-1 GPIO輸出模式下初始化函數

  • GPIO操作函數
NORDIC nrf52833使用筆記

圖7-2 GPIO控制函數

2、配置為輸入模式

  • 初始化函數
NORDIC nrf52833使用筆記

圖7-3 GPIO輸入模式下初始化函數

其中,BUTTON_PULL可選項如下

NORDIC nrf52833使用筆記

圖7-4 GPIO輸入模式下上下拉的可選配置

  • GPIO操作函數
NORDIC nrf52833使用筆記

圖7-5 GPIO輸入模式下操作函數

另外Nordic已內建好按鍵事件處理的代碼,詳見nRF_Libraries下的app_buttons.c和bsp.c

(二)、TWI(I2C/UART)

打開examples\peripheral\twi_sensor\pca10040\blank\ses目錄下的emProject項目。

1、TWI初始化函數

NORDIC nrf52833使用筆記

圖7-6 TWI(I2C)初始化函數

2、TWI操作函數

  • TWI寫操作函數
NORDIC nrf52833使用筆記

圖7-7 TWI(I2C)寫操作函數

NORDIC nrf52833使用筆記

圖7-8 TWI(I2C)寫操作函數API各參數的詳細說明

各參數的含義如下所示:

  • p_instance:初始化時的執行個體
  • address:I2C裝置的位址
  • p_data:發送的資料buffer,傳入的資料為數組{reg_addr, reg_val(有的話),…}
  • length:傳入資料的長度
  • no_stop:是否發送停止信号
  • TWI讀操作函數
    NORDIC nrf52833使用筆記
    圖7-9 TWI(I2C)讀操作函數
NORDIC nrf52833使用筆記

圖7-10 TWI(I2C)讀函數API各參數的詳細說明

各參數的含義如下所示:

  • p_instance:初始化時的執行個體
  • address:I2C裝置的位址
  • p_data:存放接收資料的buffer
  • length:接收資料的長度

八、移植不同型号DK

最直接的方法就是參照其他pca10100的項目檔案,直接修改emProject檔案内部與晶片相關的參數

  • 開發闆相關的配置(如開發闆pca10040->pca10100)
  • 适配RAM和Flash位址和大小(如RAM和Flash大小,以及帶softdevice時剩餘的flash大小)
  • 晶片相關的啟動檔案(如52832->52833)

九、參考文檔

  • 晶片手冊

    nRF52833晶片說明

    nRF58233晶片手冊

  • SES相關

    SEGGER Embedded Studio IDE下載下傳連結

    SES激活

  • SDK開發相關

    nRF5 nRF5-SDK下載下傳

    nRF5 SDK (離線)文檔

    Getting Started

    start developing

    USB examples

  • 開發工具

    wireshark 網絡分析工具

    Nordic E2E Forum

    Nordic 開發工具(nRF Sniffer、nRF Connect…)