NRF52832初步使用

来源:https://www.cnblogs.com/silencehuan/archive/2018/05/16/9045669.html
-Advertisement-
Play Games

開發環境涉及到協議棧SDK版本、keil PACK版本的匹配問題,目前測試通過的環境如下: windows系統:win10 硬體:NRF52832測試板、JLINK-V8模擬器 Keil uVision5 For ARM 5.14 nrfgostudio_win-64_1.21.2_installe ...


  1. 開發環境搭建
  • 開發環境涉及到協議棧SDK版本、keil PACK版本的匹配問題,目前測試通過的環境如下:
  • windows系統:win10
  • 硬體:NRF52832測試板、JLINK-V8模擬器
  • Keil uVision5 For ARM 5.14
  • nrfgostudio_win-64_1.21.2_installer
  • nRF5_SDK_11.0.0
  • NordicSemiconductor.nRF_DeviceFamilyPack.8.5.0.pack

 

  軟體都安裝完畢後,就可以開始進行調試了。

  1.   協議棧燒錄

  開發板通過SWD介面連接調試模擬,通過nrfgo官方工具燒寫藍牙協議棧(s132);

  協議棧hex文件在sdk的路徑:nRF5_SDK_11.0.0_89a8197\components\softdevice\s132\hex.

  先擦除,寫入s132協議棧,應用部分在keil上編程燒寫及調試。

 

  2.NRF52832添加串口私有服務透傳實現

  • 打開nRF5_SDK_11.0.0_89a8197\examples\ble_peripheral\ble_app_uart\pca10040\s132\arm5_no_packs常式,我們的開發基於常式修改就可以了;
  • NRF52832初始化分一般流程,主要需要設置的是連接參數(時間間隔)、廣播間隔、掃描響應數據等

  

int main(void)
{
    uint32_t err_code;
    bool erase_bonds;

    // Initialize.
    //APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);
    uart_init();    //串口硬體初始化
    APP_LOG("\r\nNRF52832常式測試!\r\n");
    
    timers_init();    //定時器創建
    APP_LOG("\r\n應用定時器初始化!\r\n");
    
    buttons_leds_init(&erase_bonds);    //使用BSP驅動功能較完善,到時修改
    APP_LOG("\r\nBSP按鍵、LED初始化!\r\n");
//    leds_init();
//    buttons_init();
    
    ble_stack_init();
    APP_LOG("\r\nBLE協議棧初始化!\r\n");
    gap_params_init();
    APP_LOG("\r\nGAP參數設置初始化:\r\n");
    APP_LOG("   最小連接間隔:20ms\r\n");
    APP_LOG("   最大連接間隔:75ms\r\n");
    APP_LOG("   從機延遲:0\r\n");
    APP_LOG("   連接超時:4s\r\n");
    
    services_init();        //添加私有服務,需要初始化在廣播初始化之前
    APP_LOG("\r\n添加私有服務\r\n");
    advertising_init();
    APP_LOG("\r\n廣播初始化\r\n");
    conn_params_init();

    err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
    APP_ERROR_CHECK(err_code);
      
    application_timers_start();//開始定時,時間間隔
    // Enter main loop.
    for (;;)
    {
        power_manage();
    }
}
  • 串口私有服務主要在services_init()中添加

  #include "ble_nus.h"        //藍牙串口服務

  同時工程中添加對應文件及引用路徑如下圖:

 

static void services_init(void)
{
    uint32_t        err_code;
    ble_nus_init_t  nus_init;
//    ble_lbs_init_t  lbs_init;
    
    memset(&nus_init, 0, sizeof(nus_init));
    nus_init.data_handler = nus_data_handler;       //藍牙接收數據串口處理
    err_code = ble_nus_init(&m_nus, &nus_init);     //添加nus的GATTS服務UUID
    APP_ERROR_CHECK(err_code);
    
//    memset(&lbs_init, 0, sizeof(lbs_init));
//    lbs_init.led_write_handler = led_write_handler;
//    err_code = ble_lbs_init(&m_lbs, &lbs_init);     //特性:按鍵位元組、LED位元組
//    APP_ERROR_CHECK(err_code);
}
  •  藍牙串口服務的接收數據處理函數,實現藍牙接收串口發送

  services_init

  nus_data_handler

static void nus_data_handler(ble_nus_t * p_nus, uint8_t * p_data, uint16_t length)
{
    for (uint32_t i = 0; i < length; i++)
    {
        while(app_uart_put(p_data[i]) != NRF_SUCCESS);  //數據串口發送
    }
    while(app_uart_put('\n') != NRF_SUCCESS);
}

  

  • 串口接收藍牙發送(數據以回車為結束位)

  uart_init  //串口初始化,註冊串口接收事件處理函數

  uart_event_handle  //串口數據接收處理函數

void uart_event_handle(app_uart_evt_t * p_event)
{
    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];    //藍牙規範限長20位元組
    static uint8_t index = 0;
    uint32_t       err_code;

    switch (p_event->evt_type)
    {
        case APP_UART_DATA_READY:
            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
            index++;

            if ((data_array[index - 1] == '\n') || (index >= (BLE_NUS_MAX_DATA_LEN)))
            {
                err_code = ble_nus_string_send(&m_nus, data_array, index);  //藍牙無線發送
                if (err_code != NRF_ERROR_INVALID_STATE)
                {
                    APP_ERROR_CHECK(err_code);
                }
                
                index = 0;
            }
            break;

        case APP_UART_COMMUNICATION_ERROR:
            APP_ERROR_HANDLER(p_event->data.error_communication);
            break;

        case APP_UART_FIFO_ERROR:
            APP_ERROR_HANDLER(p_event->data.error_code);
            break;

        default:
            break;
    }
}

static void uart_init(void)
{
    uint32_t                     err_code;
    const app_uart_comm_params_t comm_params =
    {
        RX_PIN_NUMBER,
        TX_PIN_NUMBER,
        RTS_PIN_NUMBER,
        CTS_PIN_NUMBER,
        APP_UART_FLOW_CONTROL_DISABLED, //禁止硬體流控制
        false,
        UART_BAUDRATE_BAUDRATE_Baud115200
    };

    APP_UART_FIFO_INIT( &comm_params,
                       UART_RX_BUF_SIZE,
                       UART_TX_BUF_SIZE,
                       uart_event_handle,   //串口接收事件處理(串口接收-藍牙發送)
                       APP_IRQ_PRIORITY_LOW,
                       err_code);
    APP_ERROR_CHECK(err_code);
}
  • 串口私有服務UUID

  

  私有服務UUID服務的添加在ble_nus_init中實現:

  rx_char_add(p_nus, p_nus_init);  //添加串口接收特征位元組

  tx_char_add(p_nus, p_nus_init);  //添加串口發送特征

 

  串口私有服務通過掃描響應的方式告訴主設備對應的服務UUID信息,在advertising_init()中添加掃描響應數據;

  static ble_uuid_t                       m_adv_uuids[] = {{BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}};

  

 

  3.調試

  通過keil編譯下載程式到測試板中,通過手機BLE調試助手和PC的串口調試助手即可實現藍牙串口簡單的數據透傳。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 開源且功能強大的C# 擴展方法類庫Pure.Ext (支持.Net Framework和.Net Core) ...
  • 在Linux系統中使用yum安裝軟體時,提示yum處於鎖定狀態 通過查詢得知,可能是系統內部在自動升級,可通過強制關閉yum進程 之後yum就可以正常使用了 ...
  • cat命令 作用:連接多個文件並且列印到屏幕輸出,或者重定向到其他文件,也可以用來查看顯示單個文件,或者多個文件。 格式: cat [option] [file] 1,最簡單的用法,直接跟文件名稱,查看文件內容 2,也可以使用如下方式,向文件寫入或者追加內容 3,-n與-b 都是對文件進行編號,-b ...
  • 偽靜態: 把動態網頁的請求方式偽裝成靜態網頁 要使用偽靜態技術,要在httpd.conf中啟用偽靜態模塊: 把前面的#號去掉 通常利用Apache的rewrite模塊對 URL 進行重寫的時候, rewrite規則會寫在 .htaccess 文件里。但要使 apache 能夠正常的讀取.htacce ...
  • 一、配置介紹 1.1 常用命令 當前 uboot 的配置已經完全變成Linux 內核的配置形式了,完全可以按照Linux 內核的分析方是區分析 uboot。 uboot 和 Linux的代碼配置項由 Kconfig 來完成的,關於 Kconfig 語法,可參見:linux/Documentation ...
  • 問題背景: 業務需要,針對業務需要不同地域的機構訪問,所以需要在同一臺機器上配置不同IP並配置不同網關,實現不用機構可以訪問同一臺伺服器辦理業務。 系統環境: centos linux7 網路環境: 伺服器是vmware虛擬伺服器,手動添加一塊新網卡eth1,要求配置如下。 eth0:10.0.7. ...
  • 問題:在wsus content文件夾下誤刪除文件,需要重新下載文件解決方法:打開cmdcd C:\Program Files\Update Services\Tools\.\wsusutil.exe reset這時WSUS會下載所有已經審批但是不在WSUS Content文件加的更新 wsusui ...
  • 《深入理解電腦系統》,這本書,我多次想要好好完整的讀一遍,每次都是沒有堅持下去,但是作為一個開發者,自己想要成為為數不多的大牛之一,所以打算這次把這本書完整的好好讀一遍,並整理為相關的博客! 書的開頭說了一句話:電腦系統是由硬體和系統軟體組成,他們共同工作來運行應用程式。我們通常接觸更多的是應用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...