博客專欄

EEPW首頁 > 博客 > STM32WB調(diào)試總結(jié)

STM32WB調(diào)試總結(jié)

發(fā)布人:345dog 時間:2020-02-17 來源:工程師 發(fā)布文章

去年四月份入手了STM32WB系列的一個開發(fā)板,入手之后一直閑置了起來。其實(shí)還是因?yàn)閼?。懶惰不僅能使綠洲變成廢墟,而且還能使好的開發(fā)板變成了廢物。當(dāng)初還動了把它掛在咸魚上賣了的念頭,但是想了想還是不了,畢竟當(dāng)初買的時候很費(fèi)勁,還需要從米國才能買到。而且到手的時候正坐在研究生復(fù)試的教室里。還是好好保存了起來。現(xiàn)在覺得自己沒有把它賣掉真是英明的決策。

因?yàn)閷?shí)驗(yàn)室項(xiàng)目需要就開始調(diào)試這塊板子,因?yàn)橘I的開發(fā)板套件(如圖1)里包含了2塊板子,正好可以做P2P通信實(shí)驗(yàn)。但是小的板子并沒有把串口和U口連接,這在調(diào)試時輸出信息方面就很不方便。為了調(diào)試方便并且測試Router功能,就重新買了一套開發(fā)板。

圖1 開發(fā)板套件

以前接觸的藍(lán)牙都是用它當(dāng)做數(shù)據(jù)透傳模塊,用藍(lán)牙模塊懟上MCU就OK。但是ST這款芯片是雙核芯片,一個是M4核主要負(fù)責(zé)數(shù)據(jù)的收集和計(jì)算,也就是說我們開發(fā)者可以只關(guān)心M4核,我們編寫的應(yīng)用程序都在M4核上進(jìn)行去跑。M0核主要負(fù)責(zé)藍(lán)牙協(xié)議棧。藍(lán)牙協(xié)議棧直接以bin文件的形式固化在M0核上,其實(shí)就是一個“黑匣子”的形式存在。兩個核之間通過“郵箱”進(jìn)行去通信。

ST附帶的P2P通信只是兩個模塊之間連接以后可以相互點(diǎn)亮LED,雖然并沒有實(shí)際的用途,但是至少給了足夠的幫助,只要認(rèn)認(rèn)真真地讀源碼然后更改關(guān)鍵點(diǎn)就可以讓它為自己所用。當(dāng)然對于經(jīng)驗(yàn)資深的藍(lán)牙開發(fā)大咖來說可能很快就解決。但是我作為剛接觸藍(lán)牙的初學(xué)者著實(shí)費(fèi)了一番功夫。

首先要搞清楚該芯片的啟動過程,這對讀程序有很大的幫助,不然一會這個文件中的函數(shù)又跳到那個函數(shù),很容易出現(xiàn)當(dāng)前文件中的函數(shù)讀懂但是不知道在哪里調(diào)用這種情況。 芯片的啟動過程如下。

1 在main函數(shù)中調(diào)用響應(yīng)的函數(shù)來初始化時鐘,功耗模式,RTC服務(wù)器,調(diào)度器。

2 進(jìn)入app_entry.c文件中

3 調(diào)用APPE_Init()函數(shù)初始化BSP,初始化系統(tǒng)通道,初始化用戶自己的應(yīng)用程序。關(guān)于系統(tǒng)通道初始化的問題。郵箱的系統(tǒng)通道只有M4核來初始化。

1)在app_entry.c文件中的APPE_Init()函數(shù)中調(diào)用appe_TL_Init()函數(shù)初始化對于CPU2的系統(tǒng)和存儲通道

2)在appe_TL_Init()調(diào)用TL_Init()函數(shù)進(jìn)入tl_mbox.c文件初始化CPU2共享的SRAM2的表。

3)返回到app_entry.c文件中

4)調(diào)用shci_init()函數(shù)進(jìn)入shci_tl.c函數(shù)中初始化CPU2的系統(tǒng)通道

5)在shci_tl.c文件中調(diào)用TL_SYS_Init()函數(shù)進(jìn)入tl_mbox.c文件中

6)從tl_mbox.c文件中返回到shci_tl.c文件中再返回app_entry.c文件中

7)在app_entry.c文件中調(diào)用TL_MM_Init()文件進(jìn)入tl_mbox.c中初始化CPU2的內(nèi)存通道

8)從tl_mbox.c文件中返回到app_entry.c文件中

9)在app_entry.c中調(diào)用TL_Enable.c文件中進(jìn)入tl_mbox.c文件中開始CPU2.然后返回到main函數(shù)中等待系統(tǒng)通道就緒

10)Tl_mbox.c文件中將“收到系統(tǒng)就緒事件”傳送給shci_tl.c文件中采用IPCC中斷調(diào)用shci_notify_asynch_evt()函數(shù)進(jìn)入app_entry.c中報(bào)告給app_entry.c

11)由于此時整個系統(tǒng)處在等待狀態(tài)。此時在等待狀態(tài)下調(diào)用shci_user_evt_proc()進(jìn)入shci_tl.c文件中再向應(yīng)用程序報(bào)告之前先正確處理報(bào)告事件

12)處理后從shci_tl.c文件中調(diào)用APPE_SysUserEvtRx()進(jìn)入app_entry,c文件中向用戶程序報(bào)告此時系統(tǒng)通道已經(jīng)就緒。

13)在接收到“系統(tǒng)就緒事件”后向用戶報(bào)告系統(tǒng)通道就緒前,用戶可以調(diào)用app_ble.c中的APP_BLE_Init()來啟用BLE棧

14)在APP_BLE_Init()函數(shù)中調(diào)用hci_init()函數(shù)進(jìn)入hci_tl.c文件再調(diào)用BLE_TL_Init()函數(shù)進(jìn)入tl_mbox.c文件中初始化BLE傳輸層(注系統(tǒng)剛開始是初始化了所有層,然后再在這里才開始初始化BLE的傳輸層)

15)完成BLE傳輸層初始化以后調(diào)用SHCI_C2_BLE_Init啟動BLE協(xié)議棧

16)CMO接收到啟動命令后返回一個命令

17)接收到該命令后可以發(fā)送BLE命令

18)調(diào)用Ble_Hci_Gap_Gatt_Init();初始化GAP層和GATT層

初始化GAP層和GATT層完成后,就可以利用藍(lán)牙來做我們自己的的事情。官方的Demo里出了一些HAL庫驅(qū)動和BSP驅(qū)動外。和我們關(guān)系比較大的主要是“main.c”,“app_ble.c” “p2p_server_app.c” “p2p_client_app.c”和“p2p_stm.c”文件。

其中p2p.stm.c文件主要是在應(yīng)用程序中創(chuàng)建服務(wù)和特性以更新特征,接收通知或?qū)懭朊睿⒃贐LE無線堆棧和應(yīng)用程序之間建立連接。aci_gatt_update_char_value()函數(shù)用來更新特性的值,其中的一個參數(shù)是數(shù)據(jù)的長度,我們?nèi)绻氚l(fā)送任意長度的數(shù)據(jù),只需要把這個長度參數(shù)更改即可,程序中的所有此函數(shù)的長度都要與自己所需的數(shù)據(jù)長度相一致。(長度的范圍在0-243字節(jié))。服務(wù)初始化函數(shù)為p2p_stm_Init()函數(shù)主要有以下功能1 注冊服務(wù)控制的點(diǎn)對點(diǎn)處理事件 2 初始化服務(wù)UUID aci_gatt_add_ser()函數(shù)將P2P服務(wù)作為主要服務(wù)。3初始化P2P寫特性 aci_gatt_add_char()函數(shù)添加寫特性 4 初始化P2P通知特性 aci_gatt_add_char_add notify characteristic 5 更新通知特性 P2PS_STM_update_char()    

與應(yīng)用相關(guān)的函數(shù)主要在p2p_server_app.c文件和p2p_client_app.c文件中。P2PS_STM_App_Notification函數(shù)主要用來接收并響應(yīng)來自GATT層的BLE堆棧的內(nèi)部事件。P2PS_send_Notification()函數(shù)調(diào)用服務(wù)函數(shù)來更新通知特性。 

app_ble.c文件中主要是對BLE的一些操作,定義了一個諸如context,廣播操作函數(shù),連接操作函數(shù),掃描操作函數(shù)和GAP_GATT層操作函數(shù)。其中Ble_Hci_Gap_Gatt_Init(void)函數(shù)用來初始化GAP_GATT層,在函數(shù)中調(diào)用aci_hal_set_tx_power_level(1, CFG_TX_POWER);函數(shù)可以更改****功率。Adv_Request函數(shù)則廣播數(shù)據(jù),將設(shè)備的廣播名字,設(shè)備的廣播間隔廣播出去。void BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle)函數(shù)主要喲用來更改連接間隔,該函數(shù)中調(diào)用aci_l2cap_connection_parameter_update_req函數(shù)可以更改連接的一些參數(shù)。

“p2p_client_app.c”文件中沒有為客戶端創(chuàng)建服務(wù),只需要注冊GATT客戶端處理程序就可以在應(yīng)用程序中識別通知GATT事件。和開始發(fā)現(xiàn)管理遠(yuǎn)程P2P服務(wù)特性相關(guān)的api函數(shù)主要有aci_gatt_disc_all_char_of_service(),aci_gatt_disc_all_char_disc() aci_gatt_write_char_disc()函數(shù)。在文件中管理GATT事件用來查找和注冊遠(yuǎn)程設(shè)別特征句柄函數(shù)為SVCCTL_EvtAckStatus_t Event_Handler()函數(shù)。 當(dāng)服務(wù)和特性發(fā)現(xiàn)后,Client函數(shù)可以用來使用寫特性控制遠(yuǎn)程設(shè)備,利用接收通知來通知特性。

有關(guān)源碼和相關(guān)文檔鏈接如下:

?STM32WB P2P.zip:

下載地址 https://download.csdn.net/download/dog345/12157047

?STM32WB器件文檔手冊.zip:

下載地址 https://download.csdn.net/download/dog345/11153831

?STM32WB點(diǎn)對點(diǎn)通信:

下載地址 http://share.eepw.com.cn/share/download/id/386814

?STM32WB點(diǎn)對點(diǎn)通信相關(guān)文檔:

下載地址 http://share.eepw.com.cn/share/download/id/386815

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉