同樣的代碼在Nordic官方開發(fā)板上可以運(yùn)行正常,但在自己板子上就跑不起來,如果你碰到了上述情況,建議按照如下步驟進(jìn)行自檢:
首先確認(rèn)用戶板元器件焊接良好,功能正常。如果你的板子有LED的話,你可以下載Blinky程序去點(diǎn)亮它,Blinky程序所在SDK目錄為:SDK安裝目錄examplesperipheralblinky。如果你的板子沒有LED,但有UART的話,可以下載CLI代碼去進(jìn)行UART交互,CLI代碼所在目錄為:SDK安裝目錄examplesperipheralcli。如果這2個(gè)程序能運(yùn)行正常,說明你的焊接問題不大。
確認(rèn)高頻晶振工作正常。由于射頻一定要用到外部高頻晶振,建議用示波器測一下高頻晶振是否可以正常起振,以確保高頻晶振工作沒問題。這里需要注意的是,Nordic nRF5芯片高頻時(shí)鐘默認(rèn)使用內(nèi)部RC作為時(shí)鐘源,為了讓外部高頻晶振起振,必須使用代碼顯式地打開高頻晶振,可以使用如下2種方式之一來顯式地打開高頻高精度外部晶振:
API方式
ret_code_t err_code = nrf_drv_clock_init(); ASSERT((err_code == NRF_SUCCESS) || (err_code == NRF_ERROR_MODULE_ALREADY_INITIALIZED)); nrf_drv_clock_hfclk_request(NULL); while (!nrf_drv_clock_hfclk_is_running()) { // spin lock }
直接操作寄存器方式
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0; NRF_CLOCK->TASKS_HFCLKSTART = 1; while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0);
確認(rèn)有沒有燒寫softdevice以及softdevice版本是否正確。請使用SDK里面自帶的softdevice進(jìn)行測試
確認(rèn)有沒有外部低頻32K晶振。Softdevice默認(rèn)使用外部32K晶振作為低頻時(shí)鐘,如果你的板子沒有外部32K晶振,那么需要更改協(xié)議棧默認(rèn)初始化參數(shù),將低頻時(shí)鐘改為內(nèi)部RC 32K。最新版本SDK需要更改sdk_config.h文件中的如下地方:
老版本SDK(SDK13之前)直接在源文件中做如下更改:
nrf_clock_lf_cfg_t clock_lf_cfg = NRF_CLOCK_LFCLKSRC; clock_lf_cfg.source = NRF_CLOCK_LF_SRC_RC; clock_lf_cfg.rc_ctiv = 16; clock_lf_cfg.rc_temp_ctiv = 2; //nRF52為2;nRF51為1;詳情請看SDK相關(guān)頭文件說明
確認(rèn)有沒有打開DCDC模式。軟件打開了DCDC模式,而用戶板又沒有DCDC相關(guān)外圍電路,那么板子跑不起來也就正常了。如果屬于這種情況,把軟件中的調(diào)用語句:sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE),刪掉即可。
確認(rèn)用戶板芯片型號(hào)和DK上的芯片型號(hào)是不是一致。nRF51/nRF52系列里面包含多個(gè)子產(chǎn)品,每個(gè)子產(chǎn)品之間Flash或者RAM空間會(huì)有所不同。Nordic DK使用了資源最大最全的那個(gè)型號(hào),如果你選擇的型號(hào)Flash空間或者RAM空間跟DK上的不一樣,那么你需要將工具鏈的鏈接腳本中Flash和RAM的值進(jìn)行相應(yīng)調(diào)整,其中Keil調(diào)整Flash和RAM空間的界面如下所示:
確認(rèn)用戶板引腳定義有沒有與DK相沖突。nRF5芯片在用戶板上有可能與傳感器,顯示屏,GPRS模塊,按鍵等相連,這其中用到的IO引腳有可能被固件初始化為其他用途,比如UART日志打印,也就是說,同樣的引腳,用戶板定義的功能和DK定義的功能不一致,所以DK可以正常運(yùn)行,而用戶板無法正常運(yùn)行。此時(shí)一定要把相關(guān)引腳按照用戶板的設(shè)計(jì)目的重新初始化,這樣就可以解決這個(gè)沖突問題。常見的資源定義沖突有:
buttons_leds_init()函數(shù)。buttons_leds_init會(huì)將某些IO口定義為按鍵和LED,如果用戶板和DK定義不一樣,有可能會(huì)出問題。
uart_init()。當(dāng)采用uart打印log的時(shí)候,固件程序會(huì)對(duì)uart進(jìn)行初始化,此時(shí)有可能會(huì)導(dǎo)致資源定義沖突,比如用戶板將相關(guān)uart引腳用于其他功能,從而導(dǎo)致板子跑不起來。
SPI,TWI等其他外設(shè)資源定義沖突。必須確保所有外設(shè)引腳定義跟用戶板一致,而不是使用DK默認(rèn)值,否則有可能導(dǎo)致用戶板跑不起來。
請確認(rèn)外部高頻晶振的頻率。這個(gè)只有nRF51有這個(gè)檢查項(xiàng),nRF52不存在這個(gè)問題,如果你使用的是nRF52的話,可以跳過這項(xiàng)不看。nRF51同時(shí)支持16M和32M外部晶振(注:nRF52只支持32M外部晶振),而且系統(tǒng)默認(rèn)外部晶振為16M,如果你選擇的外部晶振是32M,那么需要在軟件中對(duì)其進(jìn)行額外配置,否則系統(tǒng)跑不起來。此種情況有2種解決方法:
方法1。修改UICR中的寄存器XTALFREQ,由于UICR是Flash,對(duì)UICR的修改可以和代碼下載合并在一塊去做。(推薦使用方法1)
方法2。在main函數(shù)的開始處,加入NRF_CLOCK->XTALFREQ=0x00,即可。
最后也是最重要的,debug問題具體出在哪,你可以通過打日志方式進(jìn)行debug,也可以通過IDE的debug功能去調(diào)試,具體請參考:如何調(diào)試nRF5 SDK。記住,定位問題的時(shí)候,一定要定位到問題具體出在哪一行代碼,而不是某個(gè)函數(shù),否則問題就不算定位成功。問題沒有定位成功,當(dāng)然就無從下手去解決它。反之,定位到出問題的代碼行,你自己就可以很快分析問題原因所在,從而快速解決它。
審核編輯 黃宇
-
開發(fā)板
+關(guān)注
關(guān)注
25文章
5678瀏覽量
104599 -
SDK
+關(guān)注
關(guān)注
3文章
1077瀏覽量
49061 -
Nordic
+關(guān)注
關(guān)注
9文章
211瀏覽量
48139
發(fā)布評(píng)論請先 登錄
在i.MX RT 1176上正常運(yùn)行代碼時(shí)與使用IAR調(diào)試代碼時(shí)存在一些奇怪的差異,為什么?
STM32F103RBT6開發(fā)板每次程序都得重新燒錄才能正常運(yùn)行,如何解決?

#DeepSeek 在Banana Pi #RK3576 #RK3588 開發(fā)板上運(yùn)行良好,運(yùn)行效率高
龍鷹一號(hào)siengine SE1000開發(fā)板測評(píng)

藍(lán)牙耳機(jī)連接不上怎么辦
在DVEVM上通過ddd運(yùn)行Demo

TPA311開發(fā)板上面如圖紅色框框,框起來的部分是不是代表著在PCB上的開窗?
在rt-thread bsp里esp32c3里編譯出的bin文件燒到esp32的開發(fā)板上運(yùn)行提示chipid不對(duì),為什么?
在TI開發(fā)板上啟用Android Automotive

linux開發(fā)板如何編譯curl
瑞薩開發(fā)板?RX-FSOE-REF-KIT功能安全使用介紹(上)

ElfBoard技術(shù)貼|如何在ELF 1開發(fā)板上搭建流媒體服務(wù)器

評(píng)論