• 正文
  • 推薦器件
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

藍(lán)牙開發(fā)的一點(diǎn)心得

2024/04/25
2562
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

最近在使用芯海的藍(lán)牙芯片開發(fā)一個(gè)小項(xiàng)目,功能其實(shí)很簡(jiǎn)單,類似于防丟器,只不過(guò)這個(gè)項(xiàng)目中的主機(jī)也是藍(lán)牙芯片,而不是手機(jī)。這就不得不去學(xué)習(xí)更多的協(xié)議棧相關(guān)的東西。然而,最讓人頭疼的并不是藍(lán)牙協(xié)議本身的學(xué)習(xí),畢竟這是SIG發(fā)布的通行的一套協(xié)議棧,無(wú)論誰(shuí)家的藍(lán)牙都應(yīng)遵守。最讓人頭疼的是,每一家做藍(lán)牙芯片的廠家,都有一套自己實(shí)現(xiàn)SIG BLE協(xié)議棧的源代碼,這時(shí)候可是真的看出條條大路通羅馬了。

硬件來(lái)比喻的話,就相當(dāng)于SIG 出了一個(gè)原理圖,各家廠家按照原理圖畫了各自的線路板,學(xué)藍(lán)牙開發(fā)就像是看那個(gè)亂七八糟PCB gerber圖紙,各家都不一樣。

我最早接觸藍(lán)牙用的是nordic,天天纏著FAE折騰了一個(gè)月才熟悉了它的那套代碼,后來(lái)還直接把它的DFU重構(gòu)了一下,適應(yīng)了自己公司的OTA協(xié)議。后來(lái)開發(fā)泰凌微,又是一套新東西,不但整套源代碼框架不同,就連IDE也是換了,用起來(lái)就像從現(xiàn)代文明一下進(jìn)入刀耕火種一樣。以至于從那以后,但凡有人給我推薦藍(lán)牙,我都先問(wèn)問(wèn)能不能在MDK上開發(fā),工具還是用順手的好,已經(jīng)不是調(diào)戲各種工具的年紀(jì)了。

還有一個(gè)點(diǎn),就是這些藍(lán)牙的協(xié)議棧都需要跑在一個(gè)小型的操作系統(tǒng)上,嚴(yán)格意義上來(lái)說(shuō),這只是一個(gè)稍微復(fù)雜的調(diào)度系統(tǒng),這又是一個(gè)非標(biāo)的東西,所以各家系統(tǒng)層的接口又不一樣,比如磐啟微的藍(lán)牙是基于一個(gè)開源的Zephyr系統(tǒng),我剛一拿到廠家的SDK都不知道從哪入手,第一個(gè)函數(shù)去哪里找都費(fèi)勁,所以說(shuō)為啥MDK用的人多,即便是企業(yè)用盜版的都不愿用那些開源的五花八門的東西,簡(jiǎn)單意味著綜合成本低。

昂瑞微的藍(lán)牙和nordic有點(diǎn)類似,杰里的開發(fā)起來(lái)工具就又得費(fèi)點(diǎn)勁兒了,現(xiàn)在我弄得這個(gè)芯海的藍(lán)牙,不確定是借鑒的哪一家的協(xié)議棧,log信息雖然很多,也是繞了一個(gè)星期才將將繞明白從開機(jī)啟動(dòng)到廣播,再?gòu)陌l(fā)起Connect到向從機(jī)發(fā)數(shù)據(jù),真的是繞來(lái)繞去,一會(huì)處理osal的message,一會(huì)有處理某一個(gè)應(yīng)用的message,都是從底層一個(gè)消息隊(duì)里取出來(lái)的,不同的地方都有相同的事件,再在回調(diào)函數(shù)里面處理一遍,真的暈。所以,藍(lán)牙這東西,選擇兩三個(gè)平臺(tái)就足夠折騰了。去年我在推廣方案的時(shí)候,銷售的同事三天能給整倆藍(lán)牙進(jìn)來(lái),根本學(xué)不過(guò)來(lái),關(guān)鍵在于學(xué)習(xí)這些不重樣的個(gè)性協(xié)議棧沒(méi)啥意義,我本身更想關(guān)注的是應(yīng)用怎么寫。

這么看來(lái),當(dāng)年GD把寄存器地址設(shè)計(jì)成和ST一模一樣真的是有遠(yuǎn)見,從推廣上來(lái)說(shuō),這起到了決定性作用。但是藍(lán)牙沒(méi)辦法,這個(gè)行業(yè)沒(méi)有一家獨(dú)大的的情況,即便是Nordic,TI,賽普拉斯,NXP等在市場(chǎng)上也只能算是平分秋色吧?;氐綉?yīng)用開發(fā)上,協(xié)議棧真的是折騰的我眼花繚亂,整得我整個(gè)人都不好了,基本沒(méi)心情好好寫應(yīng)用。這不,RSSI數(shù)據(jù)又出問(wèn)題了,本來(lái)都在-30dbm左右,中間總是突然竄出一個(gè)-90來(lái),這必須得加一個(gè)濾波才行。思來(lái)想去選擇了滑動(dòng)窗口濾波器,在窗口內(nèi)把最大最小值去掉。原來(lái)寫過(guò),根本不想去翻了(我必須自己寫一個(gè)算法庫(kù),可以隨手拖到工程就能用的那種),正著急的時(shí)候,想起來(lái)GPT,現(xiàn)在還是不太習(xí)慣身邊有這么個(gè)大神啊。我便向他請(qǐng)教:

#include <stdio.h>
#include <limits.h>

#define WINDOW_SIZE 10

int window[WINDOW_SIZE];
int num_elements = 0;

void update_window(int new_value) {
    if (num_elements < WINDOW_SIZE) {
        window[num_elements++] = new_value;
    } else {
        // 窗口已滿,滑動(dòng)窗口,丟棄最舊的值
        for (int i = 1; i < WINDOW_SIZE; i++) {
            window[i-1] = window[i];
        }
        window[WINDOW_SIZE-1] = new_value;
    }
}

double compute_filtered_output() {
    if (num_elements == 0) return 0.0; // 沒(méi)有數(shù)據(jù)

    int max = INT_MIN;
    int min = INT_MAX;
    int sum = 0;
  
    for (int i = 0; i < num_elements; i++) {
        if (window[i] > max) max = window[i];
        if (window[i] < min) min = window[i];
        sum += window[i];
    }
  
    // 減去最大值和最小值,再計(jì)算平均
    sum -= (max + min);
    return (double)sum / (num_elements - 2);
}

int main() {
    // 模擬輸入數(shù)據(jù)
    int data[] = {5, 10, 8, 12, 20, 1, 30, 25, 15, 50, 45, 20, 25, 10, 5};
    int n = sizeof(data) / sizeof(data[0]);

    for (int i = 0; i < n; i++) {
        update_window(data[i]);
        if (num_elements > 2) {
            printf("Filtered output: %.2fn", compute_filtered_output());
        }
    }

    return 0;
}

它還貼心的給了個(gè)說(shuō)明:

真是暖心極了!

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
TLE6250GV33 1 Infineon Technologies AG Interface Circuit, 1-Trnsvr, BICMOS, PDSO8, GREEN, PLASTIC, SOP-8

ECAD模型

下載ECAD模型
$3.27 查看
KSZ8864CNXIA-TR 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER, QCC64
暫無(wú)數(shù)據(jù) 查看
KSZ8873MLLI 1 Microchip Technology Inc DATACOM, LAN SWITCHING CIRCUIT, PQFP64
$6.1 查看

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

多年硬件從業(yè)經(jīng)驗(yàn),專注分享從研發(fā)到供應(yīng)鏈,再到精益制造過(guò)程中的經(jīng)驗(yàn)和感悟!