文章目錄
-
- 一、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…
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL4FkeNBzaU1keNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3EzN0ETNyIjM3ITMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
圖1-1 s113屬性圖
圖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
圖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到官網申請注冊即可。
圖4-1 代碼目錄圖
-
Application
存放應用程式檔案,主要有main.c和sdk_config.h檔案。
NORDIC nrf52833使用筆記
圖4-2 Application目錄圖
-
Board Definition
此處主要包含開發闆相關硬體的定義,主要涉及的是各種闆載相關的外設。
圖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的根本原因所在。
圖6-1 nRF52833晶片記憶體分布圖
(一)、不帶bootloader時的記憶體配置設定
表6-1 不帶bootloader時記憶體配置設定表
記憶體位址 | 區塊 |
---|---|
Application_size + SoftDevice_size | — |
Application | |
SoftDevice_size | — |
SoftDevice | |
0x00000000 | — |
SoftDevice_size根據不同的Softdevice進行配置
(二)、帶bootloader時的記憶體配置設定
此圖詳見官網bootloader memory map
圖6-2 帶bootloader時不同晶片不同softdevice的記憶體配置設定圖
圖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、配置為輸出模式
- 初始化函數
圖7-1 GPIO輸出模式下初始化函數
- GPIO操作函數
圖7-2 GPIO控制函數
2、配置為輸入模式
- 初始化函數
圖7-3 GPIO輸入模式下初始化函數
其中,BUTTON_PULL可選項如下
圖7-4 GPIO輸入模式下上下拉的可選配置
- GPIO操作函數
圖7-5 GPIO輸入模式下操作函數
另外Nordic已內建好按鍵事件處理的代碼,詳見nRF_Libraries下的app_buttons.c和bsp.c
(二)、TWI(I2C/UART)
打開examples\peripheral\twi_sensor\pca10040\blank\ses目錄下的emProject項目。
1、TWI初始化函數
圖7-6 TWI(I2C)初始化函數
2、TWI操作函數
- TWI寫操作函數
圖7-7 TWI(I2C)寫操作函數
圖7-8 TWI(I2C)寫操作函數API各參數的詳細說明
各參數的含義如下所示:
- p_instance:初始化時的執行個體
- address:I2C裝置的位址
- p_data:發送的資料buffer,傳入的資料為數組{reg_addr, reg_val(有的話),…}
- length:傳入資料的長度
- no_stop:是否發送停止信号
- TWI讀操作函數 圖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…)