加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

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

04/25 09:11
2296
閱讀需 8 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

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

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

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

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

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

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

真是暖心極了!

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
KSZ8895FQXI 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER
$13.59 查看
KSZ8895RQI 1 Micrel Inc Ethernet Transceiver, CMOS, PQFP128, LEAD FREE, PLASTIC, QFP-128
暫無數(shù)據(jù) 查看
KSZ9031RNXCC 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER

ECAD模型

下載ECAD模型
$2.81 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

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