STM32WB調(diào)試總結(jié)
去年四月份入手了STM32WB系列的一個(gè)開發(fā)板,入手之后一直閑置了起來。其實(shí)還是因?yàn)閼小卸璨粌H能使綠洲變成廢墟,而且還能使好的開發(fā)板變成了廢物。當(dāng)初還動(dòng)了把它掛在咸魚上賣了的念頭,但是想了想還是不了,畢竟當(dāng)初買的時(shí)候很費(fèi)勁,還需要從米國才能買到。而且到手的時(shí)候正坐在研究生復(fù)試的教室里。還是好好保存了起來?,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)試時(shí)輸出信息方面就很不方便。為了調(diào)試方便并且測試Router功能,就重新買了一套開發(fā)板。
圖1 開發(fā)板套件
以前接觸的藍(lán)牙都是用它當(dāng)做數(shù)據(jù)透傳模塊,用藍(lán)牙模塊懟上MCU就OK。但是ST這款芯片是雙核芯片,一個(gè)是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í)就是一個(gè)“黑匣子”的形式存在。兩個(gè)核之間通過“郵箱”進(jìn)行去通信。
ST附帶的P2P通信只是兩個(gè)模塊之間連接以后可以相互點(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)了一番功夫。
首先要搞清楚該芯片的啟動(dòng)過程,這對讀程序有很大的幫助,不然一會這個(gè)文件中的函數(shù)又跳到那個(gè)函數(shù),很容易出現(xiàn)當(dāng)前文件中的函數(shù)讀懂但是不知道在哪里調(diào)用這種情況。 芯片的啟動(dòng)過程如下。
1 在main函數(shù)中調(diào)用響應(yīng)的函數(shù)來初始化時(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)由于此時(shí)整個(gè)系統(tǒng)處在等待狀態(tài)。此時(shí)在等待狀態(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)告此時(shí)系統(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啟動(dòng)BLE協(xié)議棧
16)CMO接收到啟動(dòng)命令后返回一個(gè)命令
17)接收到該命令后可以發(fā)送BLE命令
18)調(diào)用Ble_Hci_Gap_Gatt_Init();初始化GAP層和GATT層
初始化GAP層和GATT層完成后,就可以利用藍(lán)牙來做我們自己的的事情。官方的Demo里出了一些HAL庫驅(qū)動(dòng)和BSP驅(qū)動(dòng)外。和我們關(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ū)懭朊?,并在BLE無線堆棧和應(yīng)用程序之間建立連接。aci_gatt_update_char_value()函數(shù)用來更新特性的值,其中的一個(gè)參數(shù)是數(shù)據(jù)的長度,我們?nèi)绻氚l(fā)送任意長度的數(shù)據(jù),只需要把這個(gè)長度參數(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的一些操作,定義了一個(gè)諸如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)文檔:
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。