發(fā)環(huán)境搭建全攻略:從驅(qū)動(dòng)安裝到BLE廣播驗(yàn)收)
簡(jiǎn)介《艾克姆科技nRF52832開(kāi)發(fā)指南-上冊(cè)》面向嵌入式初學(xué)者與BLE 5.0開(kāi)發(fā)者以IK-52832DK開(kāi)發(fā)套件為硬件平臺(tái)系統(tǒng)講解Nordic nRF52832芯片的外設(shè)原理與SDK15.2軟件編程幫助讀者從裸機(jī)工程起步快速上手低功耗藍(lán)牙與2.4GHz無(wú)線SoC應(yīng)用開(kāi)發(fā)。資源為單個(gè)PDF文檔壓縮包約18.57MB內(nèi)容涵蓋開(kāi)發(fā)板硬件描述、開(kāi)發(fā)工具、電源管理、指示燈與觸摸按鍵、蜂鳴器、電位器檢測(cè)、紅外接收、USB轉(zhuǎn)UART、I2S音頻及顯示模塊接口等章節(jié)并逐項(xiàng)說(shuō)明實(shí)驗(yàn)基于哪個(gè)工程修改、需增加哪些文件及頭文件引用方式。目前已有2511人學(xué)習(xí)適合希望按部就班掌握nRF52832外設(shè)配置與SDK框架、并遷移到物聯(lián)網(wǎng)與智能家居項(xiàng)目的開(kāi)發(fā)者參考。1. 從一塊“插上沒(méi)反應(yīng)”的板子說(shuō)起nRF52832 開(kāi)發(fā)環(huán)境到底要裝什么新板子到手USB 線一插電腦設(shè)備管理器里安安靜靜MDK 里點(diǎn)下載直接彈 “No Cortex-M Device found”這是 nRF52832 新手最常見(jiàn)的第一道坎。問(wèn)題往往不在板子而在環(huán)境沒(méi)鋪齊串口驅(qū)動(dòng)、MDK5.23、器件 pack、nRFgo Studio、J-Link 驅(qū)動(dòng)五樣缺一樣后面每一步都會(huì)以不同姿勢(shì)翻車。這份《nRF52832 開(kāi)發(fā)指南-上冊(cè)》以 IK-52832DK 開(kāi)發(fā)套件為硬件平臺(tái)圍繞 BLE 5.0 與 2.4GHz SoC 的裸機(jī)外設(shè)實(shí)驗(yàn)展開(kāi)從新建工程一路講到 GPIO、蜂鳴器、按鍵檢測(cè)。它適合剛接觸 Nordic 平臺(tái)、手里有 J-Link 和一塊 52832 板子的開(kāi)發(fā)者也適合從 STM32 轉(zhuǎn)過(guò)來(lái)、想把這套工具鏈一次裝利索的熟手。下面按我實(shí)際裝機(jī)的順序把版本、路徑、參數(shù)和翻車點(diǎn)一條條擺出來(lái)。2. 裝前把版本釘死MDK5.23、SDK15.2 與配套工具的取舍2.1 工具清單與版本對(duì)照這套環(huán)境最怕“隨手裝最新版”。指南成文于 2018 年配套的是 MDK5.23 和 SDK15.2器件支持包、J-Link 驅(qū)動(dòng)、nRFgo Studio 都是圍繞這個(gè)組合驗(yàn)證過(guò)的。我一般先把下面這張表抄到記事本里裝一樣勾一樣避免中途漏項(xiàng)。工具版本/來(lái)源作用裝錯(cuò)的表現(xiàn)串口驅(qū)動(dòng)板載 USB 轉(zhuǎn) UART 芯片對(duì)應(yīng)驅(qū)動(dòng)虛擬串口看打印設(shè)備管理器出現(xiàn)未知設(shè)備MDK5.23編譯、調(diào)試、下載高版本打開(kāi)工程報(bào)器件包不兼容器件 packNordic nRF52 系列支持包讓 MDK 認(rèn)識(shí) nRF52832新建工程選不到芯片型號(hào)nRFgo Studio配套版本燒協(xié)議棧、全片擦除BLE 程序下載后不廣播J-Link 驅(qū)動(dòng)與仿真器匹配的版本連接 SWD 調(diào)試口MDK 報(bào) No Cortex-M Device手機(jī)端 APPNordic 官方調(diào)試 APP驗(yàn)證 BLE 廣播與連接搜不到設(shè)備誤判為硬件壞版本選擇上我的原則是MDK 跟指南走 5.23不要圖新裝 5.3xSDK 用 15.2工程里的協(xié)議棧 hex 和頭文件路徑都是按這個(gè)版本組織的。器件 pack 裝完要在 MDK 的 Pack Installer 里確認(rèn) nRF52832 的 Device Family Pack 已經(jīng)變成已安裝狀態(tài)否則后面“新建工程”那一步會(huì)卡在選型界面。2.2 安裝順序?yàn)槭裁床荒軄y順序不是玄學(xué)是有依賴的。串口驅(qū)動(dòng)最先裝因?yàn)楹竺骝?yàn)證板子是否活著全靠它MDK 第二裝完再裝 packpack 會(huì)注冊(cè)到 MDK 的安裝目錄nRFgo Studio 和 J-Link 驅(qū)動(dòng)放后面它們會(huì)各自注冊(cè) USB 驅(qū)動(dòng)先裝 J-Link 再裝 nRFgo 有時(shí)會(huì)出現(xiàn)驅(qū)動(dòng)搶占。我踩過(guò)一次先裝了新版 J-Link 驅(qū)動(dòng)再裝 nRFgo Studio結(jié)果 nRFgo 打開(kāi)后識(shí)別不到仿真器設(shè)備管理器里 J-Link 項(xiàng)帶黃色感嘆號(hào)?;赝宿k法是把 J-Link 驅(qū)動(dòng)卸干凈、重啟、按指南順序重裝。# 裝完后用命令行快速確認(rèn) J-Link 是否被系統(tǒng)識(shí)別Windows 下 J-Link 安裝目錄 JLink.exe -CommanderScript verify.jlink上面這條不是必須執(zhí)行只是我習(xí)慣在裝完 J-Link 后跑一次命令行連接確認(rèn)仿真器固件和驅(qū)動(dòng)能對(duì)話。verify.jlink里寫(xiě)si SWD和device nRF52832_xxAA兩行即可能連上會(huì)打印芯片 ID連不上就直接暴露驅(qū)動(dòng)問(wèn)題比等到 MDK 里報(bào)錯(cuò)再回頭查省時(shí)間。提示所有安裝包放在純英文、無(wú)空格的路徑下比如D:\nordic_tools\。中文路徑在 pack 安裝和 J-Link 驅(qū)動(dòng)注冊(cè)階段都可能出問(wèn)題這是血淚經(jīng)驗(yàn)。3. 搭建開(kāi)發(fā)環(huán)境五樣工具逐個(gè)裝到位3.1 串口驅(qū)動(dòng)與 MDK5.23 安裝串口驅(qū)動(dòng)裝完插上板子設(shè)備管理器里應(yīng)出現(xiàn)一個(gè) COM 口。記下編號(hào)后面串口實(shí)驗(yàn)要用。如果出現(xiàn)的是帶感嘆號(hào)的未知設(shè)備先換 USB 線再確認(rèn)驅(qū)動(dòng)位數(shù)和系統(tǒng)匹配。這一步看著簡(jiǎn)單但它是判斷“板子供電和 USB 轉(zhuǎn) UART 是否正?!钡奈ㄒ坏统杀臼侄蝿e跳過(guò)。MDK5.23 安裝時(shí)有兩個(gè)參數(shù)值得注意安裝路徑不要帶空格安裝到最后彈出的 “Pack Installer” 可以先關(guān)掉等 pack 單獨(dú)裝。安裝完成后打開(kāi) Keil μVision在 Help → About 里確認(rèn)版本號(hào)是 5.23。許可證按常規(guī)方式激活評(píng)估版有 32KB 代碼限制裸機(jī)實(shí)驗(yàn)夠用但帶協(xié)議棧的 BLE 工程容易超建議提前把 License 處理好。安裝路徑示例D:\Keil_v5 Pack 根目錄D:\Keil_v5\ARM\PACK 工程路徑D:\nrf52_work\全英文無(wú)空格路徑規(guī)劃要在裝 pack 之前定下來(lái)因?yàn)?pack 會(huì)寫(xiě)進(jìn) MDK 的 PACK 目錄后面工程里的器件引用也指向這里。中途改路徑工程打開(kāi)就會(huì)報(bào)找不到器件。3.2 器件 pack 與 nRFgo Studiopack 安裝有兩種方式雙擊下載好的 pack 文件或者在 MDK 的 Pack Installer 里在線安裝。離線包更穩(wěn)在線安裝受網(wǎng)絡(luò)影響大。裝完在 Pack Installer 的 Devices 頁(yè)搜 nRF52832能看到 Nordic 的器件條目且狀態(tài)為已安裝就說(shuō)明成了。這一步失敗最常見(jiàn)的原因是 MDK 版本和 pack 版本不匹配5.23 配太新的 pack 會(huì)提示需要更高版本 MDK。nRFgo Studio 的作用常被低估。裸機(jī)程序用 MDK 直接下載沒(méi)問(wèn)題但 BLE 程序要分兩步先燒協(xié)議棧 hex再燒應(yīng)用 hex。nRFgo Studio 的 Program 頁(yè)能分別選 SoftDevice 和 Application還能做全片擦除。裝完后打開(kāi)左側(cè)能看到連接的 J-Link 和芯片型號(hào)就說(shuō)明它和仿真器驅(qū)動(dòng)握手成功。nRFgo Studio 操作路徑 Program nRF5x → 選擇 SoftDevice協(xié)議棧 hex→ Program Program nRF5x → 選擇 Application應(yīng)用 hex→ Program Erase all → 全片擦除換協(xié)議棧版本或程序跑飛時(shí)用參數(shù)上要注意協(xié)議棧 hex 在 SDK15.2 的components\softdevice\s132\hex目錄下文件名帶版本號(hào)別拿錯(cuò)。應(yīng)用 hex 在 MDK 的 Output 目錄。兩者地址段由 nRFgo 自動(dòng)處理不要手動(dòng)改起始地址改錯(cuò)就是下載成功但不廣播。3.3 J-Link 驅(qū)動(dòng)與手機(jī)端 APPJ-Link 驅(qū)動(dòng)裝完插上仿真器設(shè)備管理器里應(yīng)出現(xiàn) J-Link 條目且無(wú)感嘆號(hào)。MDK 的 Debug 選項(xiàng)卡里選 J-LINK / J-TRACE Cortex點(diǎn) Settings 能讀到 SWD 鏈路上的芯片 ID這一步通了下載鏈路才算打通。如果 Settings 里顯示 “Cannot access target”先查排線方向、板子供電再查 SWD 速率把速率從默認(rèn)降到 1MHz 往往能救回接觸不良的板子。手機(jī)端 APP 用于驗(yàn)證 BLE 廣播。裝好后打開(kāi)掃描能搜到板子廣播出的設(shè)備名說(shuō)明協(xié)議棧和應(yīng)用都跑起來(lái)了。這一步是后面 BLE 實(shí)驗(yàn)的驗(yàn)收標(biāo)準(zhǔn)建議在環(huán)境搭建階段就先跑通一次別等到寫(xiě)業(yè)務(wù)代碼時(shí)才發(fā)現(xiàn)廣播出不來(lái)。注意J-Link 驅(qū)動(dòng)版本不要盲目追新。新版驅(qū)動(dòng)對(duì)老仿真器固件可能不兼容表現(xiàn)是能識(shí)別仿真器但連不上芯片。遇到這種情況卸掉新驅(qū)動(dòng)裝指南配套版本再重啟。4. 新建裸機(jī)工程目錄、選項(xiàng)卡與第一個(gè) LED4.1 工程目錄規(guī)劃與庫(kù)文件拷貝指南的做法是從零新建工程而不是直接打開(kāi) SDK 示例。這個(gè)選擇對(duì)理解工程結(jié)構(gòu)很有價(jià)值但也意味著目錄規(guī)劃要一次做對(duì)。我的習(xí)慣是在工作目錄下建三層bsp放板級(jí)文件sdk放從 SDK15.2 拷貝的庫(kù)app放自己的 main.c 和驅(qū)動(dòng)。D:\nrf52_work\led_demo\ ├── app\ # main.c、用戶驅(qū)動(dòng) ├── bsp\ # 板級(jí)支持、LED/按鍵定義 ├── sdk\ # 從 SDK15.2 拷貝的 components、modules └── project\ # MDK 工程文件 .uvprojx拷貝庫(kù)文件時(shí)只拷用得到的模塊全量拷貝會(huì)讓工程體積和編譯時(shí)間都失控。裸機(jī) LED 實(shí)驗(yàn)至少需要 CMSIS、nRF5x 的 MDK 啟動(dòng)文件、GPIO 相關(guān)驅(qū)動(dòng)。啟動(dòng)文件在modules\cmsis\nrf52\下選arm目錄里的版本??酵暝?MDK 里新建工程選 nRF52832_xxAA再把文件分組加進(jìn)去。4.2 四個(gè)選項(xiàng)卡的配置參數(shù)工程配置是這套環(huán)境里最容易“看著都對(duì)、編譯就錯(cuò)”的環(huán)節(jié)。Target 選項(xiàng)卡里勾選 Use MicroLIB 視情況而定裸機(jī)實(shí)驗(yàn)不強(qiáng)制Output 選項(xiàng)卡勾選 Create HEX File否則 nRFgo Studio 找不到應(yīng)用 hexC/C 選項(xiàng)卡的 Include Paths 要把sdk下用到的頭文件目錄逐個(gè)加進(jìn)去少一個(gè)就是一堆未定義Debug 選項(xiàng)卡選 J-LINKSettings 里確認(rèn) SWD 和芯片型號(hào)。// C/C 選項(xiàng)卡 Preprocessor Symbols 里我一般加這兩個(gè)宏 NRF52832_XXAA BOARD_CUSTOMNRF52832_XXAA決定頭文件里寄存器定義走哪個(gè)分支寫(xiě)錯(cuò)就是編譯過(guò)但寄存器地址不對(duì)。BOARD_CUSTOM是我自己加的板級(jí)開(kāi)關(guān)用來(lái)區(qū)分官方板和自制板沒(méi)有這個(gè)需求可以不加。Include Paths 建議用相對(duì)路徑或統(tǒng)一根目錄換機(jī)器時(shí)不用逐個(gè)改。4.3 編寫(xiě) LED 驅(qū)動(dòng)并編譯燒寫(xiě)main.c 里最簡(jiǎn)結(jié)構(gòu)是包含板級(jí)頭文件、初始化 GPIO、循環(huán)翻轉(zhuǎn)。GPIO 配置走 SDK 的nrf_gpio_cfg_output和nrf_gpio_pin_write這兩個(gè)函數(shù)在nrf_gpio.h里路徑加對(duì)了就能編過(guò)。#include nrf_gpio.h #include boards.h int main(void) { nrf_gpio_cfg_output(LED_1); // 配置 LED 引腳為輸出 while (1) { nrf_gpio_pin_toggle(LED_1); // 翻轉(zhuǎn)電平 for (volatile uint32_t i 0; i 500000; i); // 粗延時(shí) } }LED_1的引腳號(hào)來(lái)自板級(jí)定義IK-52832DK 的 LED 接在哪個(gè)腳要按原理圖確認(rèn)別照抄別的板子。粗延時(shí)用空循環(huán)只為看現(xiàn)象正式代碼應(yīng)換定時(shí)器。編譯通過(guò)后點(diǎn) DownloadMDK 的 Build Output 里出現(xiàn) “Application running” 才算燒進(jìn)去。如果報(bào) “No Cortex-M Device found”回到第 3 章的 J-Link Settings 排查不要反復(fù)點(diǎn)下載。5. 程序下載三條路與避坑排查5.1 MDK 直接下載與 BLE 程序的兩步燒寫(xiě)裸機(jī)程序用 MDK 直接下載最省事Flash Download 里勾選 Erase Sectors 和 ProgramReset and Run 勾上下載完自動(dòng)跑。BLE 程序不能這么干因?yàn)閰f(xié)議棧占用了芯片起始地址段應(yīng)用 hex 的鏈接地址要避開(kāi)它。正確做法是先用 nRFgo Studio 燒協(xié)議棧再用 MDK 或 nRFgo 燒應(yīng)用。指南里把這條路徑拆得很細(xì)我按它的順序走沒(méi)出過(guò)問(wèn)題。全片擦除是救命操作。換協(xié)議棧版本、程序跑飛、下載報(bào)地址沖突先 Erase all 再重?zé)顺赡芑謴?fù)。nRFgo Studio 的 Erase all 和 J-Flash 的 Erase Chip 效果一樣選一個(gè)順手的就行。5.2 J-Flash 與 nRFgo Studio 的適用場(chǎng)景J-Flash 適合批量燒寫(xiě)和只燒 hex 不編譯的場(chǎng)景配置工程時(shí)選 nRF52832_xxAA、SWD 接口加載 hex 后點(diǎn) Program。nRFgo Studio 更適合 BLE 的分段燒寫(xiě)因?yàn)樗鼘?duì) SoftDevice 和 Application 有明確區(qū)分。兩條路都要求 J-Link 驅(qū)動(dòng)正常所以第 3 章的驅(qū)動(dòng)驗(yàn)證是共同前提。5.3 常見(jiàn)問(wèn)題排查五條踩坑記錄現(xiàn)象一MDK 下載報(bào) “No Cortex-M Device found”。原因通常是 J-Link 驅(qū)動(dòng)版本不匹配或 SWD 接觸不良。解決先在 J-Link Settings 里降速到 1MHz 試連再換短排線最后回退驅(qū)動(dòng)版本?,F(xiàn)象二編譯報(bào)一堆 “undefined symbol”指向 GPIO 函數(shù)。原因是 Include Paths 漏了modules\nrfx或components\drivers_nrf目錄。解決按報(bào)錯(cuò)的頭文件名反查所在目錄補(bǔ)進(jìn) C/C 選項(xiàng)卡不要靠猜?,F(xiàn)象三BLE 程序下載成功但不廣播。原因是只燒了應(yīng)用沒(méi)燒協(xié)議?;蛘邊f(xié)議棧版本和應(yīng)用編譯時(shí)引用的版本不一致。解決nRFgo Studio 里確認(rèn) SoftDevice 已燒再核對(duì) SDK 版本。現(xiàn)象四串口助手收不到打印。原因是 COM 口選錯(cuò)或波特率不匹配也可能是板子 USB 轉(zhuǎn) UART 那路沒(méi)供電。解決設(shè)備管理器確認(rèn) COM 編號(hào)波特率按例程設(shè)置換 USB 口試?,F(xiàn)象五換電腦后工程打不開(kāi)提示找不到器件。原因是 pack 沒(méi)裝或 MDK 版本不同。解決在新機(jī)器上按第 3 章重裝 pack工程路徑保持全英文。提示每次動(dòng)過(guò)驅(qū)動(dòng)或 pack重啟一次再驗(yàn)證。Windows 的 USB 驅(qū)動(dòng)注冊(cè)有緩存不重啟會(huì)出現(xiàn)“裝了像沒(méi)裝”的假象。6. 裝完怎么驗(yàn)證從串口打印到 BLE 廣播的驗(yàn)收清單環(huán)境裝完不能只看“沒(méi)報(bào)錯(cuò)”要有一套能復(fù)現(xiàn)的驗(yàn)收動(dòng)作。我的習(xí)慣是分三層驗(yàn)工具鏈層、裸機(jī)層、BLE 層每層都有明確的通過(guò)標(biāo)準(zhǔn)任何一層不過(guò)就停在那里修不帶著問(wèn)題上樓。工具鏈層的驗(yàn)收最直接插上板子和 J-Link打開(kāi) MDK 的 J-Link Settings能讀到芯片 ID打開(kāi) nRFgo Studio左側(cè)能列出仿真器和芯片型號(hào)設(shè)備管理器里 COM 口和 J-Link 都無(wú)感嘆號(hào)。這三條同時(shí)滿足說(shuō)明驅(qū)動(dòng)和連接鏈路是通的。我一般還會(huì)跑一次全片擦除再讀回確認(rèn) Flash 操作權(quán)限正常。裸機(jī)層的驗(yàn)收用第 4 章的 LED 工程編譯零錯(cuò)誤零警告下載后 LED 按預(yù)期閃爍串口助手能收到初始化打印如果例程帶打印。這一步通過(guò)說(shuō)明工程配置、啟動(dòng)文件、GPIO 驅(qū)動(dòng)、下載鏈路全部正確。如果 LED 不亮但下載成功先查引腳定義和板子原理圖再查是否勾了 Reset and Run。BLE 層的驗(yàn)收用協(xié)議棧加一個(gè)廣播例程nRFgo Studio 燒 SoftDevice再燒應(yīng)用 hex手機(jī)端 APP 掃描能看到設(shè)備名能連接。這一步通過(guò)說(shuō)明協(xié)議棧地址、應(yīng)用鏈接地址、射頻部分都正常。三層都過(guò)這套 nRF52832 開(kāi)發(fā)環(huán)境才算真正裝完后面做 UART、定時(shí)器、GPIOTE 實(shí)驗(yàn)都在這套底座上疊加。驗(yàn)收層檢查動(dòng)作通過(guò)標(biāo)準(zhǔn)不過(guò)先查工具鏈J-Link Settings 讀 ID顯示芯片 ID驅(qū)動(dòng)版本、SWD 排線工具鏈nRFgo Studio 識(shí)別列出仿真器和芯片USB 驅(qū)動(dòng)注冊(cè)裸機(jī)LED 工程下載運(yùn)行LED 閃爍引腳定義、Reset and Run裸機(jī)串口打印收到預(yù)期字符COM 口、波特率BLE手機(jī)掃描廣播看到設(shè)備名并可連接協(xié)議棧是否燒、版本是否一致這套清單我每次換機(jī)器或重裝系統(tǒng)都會(huì)走一遍前后不過(guò)十幾分鐘但能擋掉后面幾小時(shí)的莫名其妙。從那以后我每次裝 Nordic 環(huán)境都強(qiáng)制先跑這三層驗(yàn)收再動(dòng)業(yè)務(wù)代碼省下的排查時(shí)間遠(yuǎn)比驗(yàn)收花的多。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取