STM32F103C8T6基于HAL庫驅動NB-IoT模塊BC26通信詳 解

一、引言:?NB-IoT技術與應用場景

NB-IoT( Narrow?Band?Internet of Things?)作為低功耗廣域網( LPWAN?)的核心技術,以其廣覆???蓋、低功耗、大連接、低成本的特性,廣泛應用于智能表計、環境監測、智能農業、資產追蹤等場景。??本文基于STM32F103C8T6單片機與移遠BC26?NB-IoT模塊,通過HAL庫實現設備與阿里云IoT平臺的?通信,從硬件連接、軟件配置到代碼實現,全程圖文并茂,助力開發者快速上手NB-IoT開發。

二、硬件準備:?模塊選型與電路連接

2.1?核心硬件清單

設備名稱

型號/規格

作用

?

單片機

STM32F103C8T6(最小系統?板)

主控單元,控制傳感器與通信?模塊

NB-IoT模塊

移遠BC26(含天線、SIM卡)

實現NB網絡接入與數據傳輸

電源模塊

5V/2A直流電源

為BC26和STM32供電

傳感器(可選)

DHT11溫濕度傳感器

采集環境數據(示例用)

?

輔助工具

USB轉TTL模塊、杜邦線、面包?板

?

調試與接線

2.2?硬件連接詳解

BC26模塊與STM32通過UART串口通信,同時需注意電源隔離與信號完整性。

2.2.1?引腳連接表

STM32F103C8T6引腳

BC26模塊引腳

功能說明

PA9(USART1_TX)

RXD

STM32發送數據到BC26

PA10(USART1_RX)

TXD

STM32接收BC26返回數據

5V

VIN

模塊電源(BC26需5V供電)

STM32F103C8T6引腳

BC26模塊引腳

功能說明

?

GND

?

GND

共地(必須連接,避免信號干?擾)

PB0(可選)

PWR

模塊上電控制(低電平啟動)

三、軟件環境搭建:?開發工具與庫配置

3.1?開發工具準備

? STM32CubeMX:用于生成初始化代碼(版本6.6.1+)

? Keil MDK5:編譯與下載代碼(需安裝STM32F1xx系列支持包)

? 串口調試助手:如SSCOM、XCOM(用于監控模塊AT指令交互)

? 阿里云IoT平臺:創建產品與設備,獲取通信憑證

3.2?HAL庫與工程配置

3.2.1?STM32CubeMX配置步驟

1. 新建工程:選擇STM32F103C8T6,配置RCC為外部高速時鐘(HSE)。

2. UART配置

? 打開USART1,模式選擇“異步通信(Asynchronous)”,波特率115200,數據位8,停止位1,無校?驗。

??使能USART1中斷(NVIC Settings?→ USART1 global interrupt?→ Enabled)。

3. GPIO配置:若使用PB0控制BC26上電,配置為推挽輸出(GPIO_Output)。

4. 生成代碼:選擇“MDK-ARM”,勾選“Generate peripheral initialization as .c/.hfiles”,點擊生成工程。

四、?NB-IoT模塊核心原理:AT指令與網絡附著

4.1?BC26?AT指令集概述

BC26通過AT指令控制,核心指令如下表:

指令功能說明示例響應
AT測試模塊是否正常OK
AT+CIMI查詢SIM卡IMSI號(確認卡是否識別)460041234567890
AT+CSQ查詢信號質量(0-31,越大越好)+CSQ: 28,0
AT+CGATT?查詢網絡附著狀態(1=附著,0=未附著)+CGATT: 1
AT+QMTCFG="aliauth",0,"PK","DN","DS"配置阿里云MQTT認證信息(PK/DN/DS為設備三元組)OK
AT+QMTOPEN=0,"iot-as-mqtt.cn-shanghai.aliyuncs.com",1883連接阿里云MQTT服務器+QMTOPEN: 0,0

4.2?NB-IoT網絡附著流程

1. 模塊上電初始化:BC26上電后需1-2秒穩定,發送??AT?指令確認響應。

2. SIM卡檢測:發送 ?AT+CIMI,返回IMSI號表示SIM卡正常。

3. 信號質量檢查: ?AT+CSQ返回值需≥10(否則需調整天線位置)。

4. 網絡附著: ?AT+CGATT=1?附著網絡, ?AT+CGATT??返回1表示成功。

5. PDP上下文激活: ?AT+CGACT=1,1激活數據業務,獲取IP地址( ??AT+CGPADDR=1?)。

五、驅動代碼實現:?UART通信到阿里云對接

5.1?UART底層驅動(基于HAL庫)

5.1.1?UART初始化代碼(stm32f1xx_hal_msp.c

void HAL_UART_MspInit(UART_HandleTypeDef* huart) {GPIO_InitTypeDef GPIO_InitStruct = {0};if (huart->Instance == USART1) {__HAL_RCC_USART1_CLK_ENABLE();    // 使能USART1時鐘__HAL_RCC_GPIOA_CLK_ENABLE();     // 使能GPIOA時鐘// PA9(TX)配置為復用推挽輸出GPIO_InitStruct.Pin = GPIO_PIN_9;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// PA10(RX)配置為浮空輸入GPIO_InitStruct.Pin = GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 配置USART1中斷優先級HAL_NVIC_SetPriority(USART1_IRQn, 3, 3);HAL_NVIC_EnableIRQ(USART1_IRQn);}
}

5.1.2?UART中斷接收與AT指令解析( usart.c

uint8_t uart_rx_buf[256];  // 接收緩沖區
uint16_t uart_rx_len = 0;   // 接收長度// USART1中斷服務函數
void USART1_IRQHandler(void) {uint8_t ch;if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE)) {HAL_UART_Receive(&huart1, &ch, 1, 0x01);  // 讀取接收數據uart_rx_buf[uart_rx_len++] = ch;           // 存入緩沖區if (ch == '\n' || uart_rx_len >= 255) {    // 換行符或緩沖區滿時結束uart_rx_buf[uart_rx_len] = '\0';          // 添加字符串結束符uart_rx_len = 0;                         // 重置接收長度// 解析AT指令響應(此處可添加狀態機處理邏輯)}}HAL_UART_IRQHandler(&huart1);
}// 發送AT指令函數
HAL_StatusTypeDef AT_SendCmd(char *cmd, uint32_t timeout) {HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), timeout);  // 發送指令HAL_Delay(100);  // 等待模塊響應return HAL_OK;
}

5.2?BC26模塊初始化與阿里云連接

5.2.1?BC26初始化流程( bc26.c

// 模塊初始化狀態枚舉
typedef enum {BC26_STATE_INIT,       // 初始狀態BC26_STATE_CHECK_SIM,  // 檢查SIM卡BC26_STATE_ATTACH_NET, // 網絡附著BC26_STATE_MQTT_CONN,  // MQTT連接BC26_STATE_READY       // 就緒狀態
} BC26_StateTypeDef;BC26_StateTypeDef bc26_state = BC26_STATE_INIT;// BC26初始化函數
void BC26_Init(void) {switch (bc26_state) {case BC26_STATE_INIT:AT_SendCmd("AT\r\n", 1000);  // 測試模塊if (strstr((char*)uart_rx_buf, "OK")) {bc26_state = BC26_STATE_CHECK_SIM;memset(uart_rx_buf, 0, sizeof(uart_rx_buf));}break;case BC26_STATE_CHECK_SIM:AT_SendCmd("AT+CIMI\r\n", 1000);  // 查詢IMSIif (strstr((char*)uart_rx_buf, "460")) {  // 中國運營商IMSI以460開頭bc26_state = BC26_STATE_ATTACH_NET;memset(uart_rx_buf, 0, sizeof(uart_rx_buf));}break;// 后續狀態(網絡附著、MQTT連接)代碼省略,完整代碼見工程文件}
}

5.2.2 阿里云MQTT連接關鍵代碼

// 配置阿里云三元組(需替換為實際值)
#define PRODUCT_KEY     "a1b2c3d4e5f6g7h8i9j0k"
#define DEVICE_NAME     "NB_IoT_Device"
#define DEVICE_SECRET   "abcdef1234567890abcdef1234567890"// 連接阿里云MQTT服務器
void BC26_MQTT_Connect(void) {char cmd[256];// 配置阿里云認證sprintf(cmd, "AT+QMTCFG=\"aliauth\",0,\"%s\",\"%s\",\"%s\"\r\n", PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);AT_SendCmd(cmd, 1000);// 連接阿里云MQTT服務器(地址:iot-as-mqtt.cn-shanghai.aliyuncs.com,端口1883)AT_SendCmd("AT+QMTOPEN=0,\"iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883\r\n", 2000);if (strstr((char*)uart_rx_buf, "+QMTOPEN: 0,0")) {  // 連接成功// 訂閱主題(示例:/sys/a1b2c3d4e5f6g7h8i9j0k/NB_IoT_Device/user/get)sprintf(cmd, "AT+QMTSUB=0,1,\"/sys/%s/%s/user/get\",0\r\n", PRODUCT_KEY, DEVICE_NAME);AT_SendCmd(cmd, 1000);}
}

5.3 數據上報與接收示例

5.3.1 溫濕度數據上報(main.c)

// 假設通過DHT11獲取溫濕度(代碼省略,可參考SHT20驅動) float temp = 25.5, humi = 60.0; char data_buf[128];  // 上報數據到阿里云 void Aliyun_ReportData(float temp, float humi) {  char cmd[512];  // 構建JSON格式數據(阿里云物模型格式)  sprintf(data_buf, "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{\"CurrentTemperature\":{\"value\":%.1f},\"CurrentHumidity\":{\"value\":%.1f}},\"method\":\"thing.event.property.post\"}", temp, humi);   // 發布主題(示例:/sys/a1b2c3d4e5f6g7h8i9j0k/NB_IoT_Device/thing/event/property/post)  sprintf(cmd, "AT+QMTPUB=0,0,0,0,\"/sys/%s/%s/thing/event/property/post\",\"%s\"\r\n",  PRODUCT_KEY, DEVICE_NAME, data_buf);  AT_SendCmd(cmd, 2000); }  // 主循環 int main(void) {  HAL_Init();  SystemClock_Config();  MX_GPIO_Init();  MX_USART1_UART_Init();   while (1) {  BC26_Init(); // 模塊初始化  if (bc26_state == BC26_STATE_READY) {  Aliyun_ReportData(temp, humi); // 上報數據  HAL_Delay(10000); // 每10秒上報一次  }  HAL_Delay(100);  } }

六、調試與測試:從指令交互到平臺驗證

6.1 AT指令調試(串口助手)

通過USB轉TTL連接BC26的TX/RX引腳,使用串口助手發送AT指令,驗證模塊功能:

AT // 測試模塊 OK AT+CIMI // 查詢IMSI 460041234567890 OK AT+CSQ // 信號質量 +CSQ: 28,0 OK AT+CGATT? // 網絡附著 +CGATT: 1 OK

6.2 阿里云平臺數據查看

  1. 登錄阿里云IoT平臺:進入“設備管理 → 設備”,查看設備狀態為“在線”。
  2. 物模型數據:在設備詳情頁“物模型數據”中,可實時查看上報的溫濕度數據。
  3. 日志服務:通過“監控運維 → 日志服務”查看設備上下線記錄和數據傳輸日志。

七、進階應用:低功耗優化與多場景擴展

7.1 BC26低功耗模式(PSM)配置

BC26支持PSM(Power Saving Mode),可通過AT指令配置:

// 使能PSM模式(TAU=3600秒,Active Time=60秒) AT+CSCON=0 // 進入Idle狀態 AT+CPWROFF // 模塊斷電(實際進入PSM)

7.2 STM32低功耗配合(Stop模式)

STM32進入Stop模式,通過LPTIM定時器喚醒:

void EnterStopMode(void) {  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 進入Stop模式  // 喚醒后需重新配置系統時鐘  SystemClock_Config(); }

八、總結與擴展

本文詳細介紹了STM32F103C8T6與BC26模塊的硬件連接、軟件配置、AT指令交互及阿里云對接流程,提供了完整的代碼框架和調試方法。讀者可進一步擴展:

  • 多傳感器數據采集:添加光照、氣壓等傳感器,豐富上報數據。
  • OTA遠程升級:通過BC26實現設備固件遠程更新。
  • 多平臺對接:適配中國移動OneNET、華為OceanConnect等平臺。

技術交流:歡迎在評論區留言提問,或關注博主獲取更多物聯網開發教程!

創作聲明:本文為原創內容,轉載請注明出處。文中代碼經過實際測試,可直接移植使用。如有錯誤,歡迎指正!

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88510.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88510.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88510.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS 性能測試工具全流程:主流工具實戰對比與適用場景

在iOS開發中,性能優化往往被安排到開發后期,甚至上線前才臨時補救。但性能瓶頸通常是架構設計、資源加載、動畫機制等多方面共同作用的結果,僅憑肉眼感知和log輸出,難以精準定位。 一套合適的性能測試工具組合,不僅能幫…

目標檢測:視覺系統中的CNN-Transformer融合網絡

一、背景 無人機(UAVs)在城市自動巡邏中發揮著重要作用,但它們在圖像識別方面面臨挑戰,尤其是小目標檢測和目標遮擋問題。此外,無人機的高速飛行要求檢測系統具備實時處理能力。 為解決這些問題,我們提出了…

揭示宇宙的隱藏對稱性:群論-AI云計算拓展核心內容

通過利用云計算,借助群論對宇宙對稱性的探索,從離散群和李群等基礎概念,逐步深入到量子力學和更高自旋系統中的高級應用。 對稱性遠不止是美學上的吸引力;它是編織在宇宙結構中的一個基本原則。從雪花的復雜圖案到控制粒子的基本定…

前端項目vue3項目集成eslint@9.x跟prettier

tips: 這些涉及編輯器的修改不一定能及時生效,如果沒有生效,可以試試重啟編輯器窗口 編輯器集成 我的編輯器是vscode,需要安裝這兩個編輯器插件eslint prettier我這個配置主要是通過eslint提供的配置cli命令生成,在里面加入了對pr…

登錄超時問題的排查方法與預防經驗分享

??一、排查方法????檢查網絡連接??確保網絡穩定,嘗試重啟路由器或切換網絡(如從WiFi切換到移動數據)。使用命令(如 ping 或 traceroute)測試網絡連通性,排查是否存在丟包或高延遲。??驗證服務端狀…

uniapp,Anroid10+版本如何保存圖片并刪除

Android 10系統開始 進一步增強了平臺功能,為外部存儲設備上的應用和用戶數據提供了更好的保護。作為這項工作的一部分,平臺引入了進一步的改進,以簡化向分區存儲的轉換。 為了讓用戶更好地控制自己的文件,保護用戶隱私數據&#…

Jenkins Pipeline 語法

Pipeline 簡介 Jenkins2.x 的核心是使用 pipeline 來構建項目,也就是流水線,將 Jenkins1.0 版本中基于表單的配置信息比如 JDK/SVN 以及參數的配置都轉變成了代碼,即 pipeline as Code。 傳統的表單方式有以下缺點: 需要大量的 web 表單交互,有時候需要進行很多次的切換…

搭建滲透測試環境

一、基于docker搭建靶場 #此步驟需要科學上網 #從軟件源中下載 docker.io 和 docker -compose 軟件包及其依賴項。 sudo apt-get install docker.io docker-compose #查看docker版本 docker -v #查看docker信息 docker info #重啟docker服務 sudo systemctl daemon-reload sudo…

(一)OpenCV——噪聲去除(降噪)

高斯濾波器(針對高斯噪聲) 高斯噪聲是指它的概率密度函數服從高斯分布(即正態分布)的一類噪聲。常見的高斯噪聲包括起伏噪聲、宇宙噪聲、熱噪聲和散粒噪聲等等。 高斯濾波(Gaussian filter) 包含許多種,包括低通、帶…

百度開源文心 4.5 系列開源大模型 GitCode 本地化部署,硅基流動:文心 vs. DeepSeek vs. Qwen 3.0 深度測評

百度開源文心 4.5 系列開源大模型 GitCode 本地化部署,硅基流動:文心 vs. DeepSeek vs. Qwen 3.0 深度測評 文章目錄百度開源文心 4.5 系列開源大模型 GitCode 本地化部署,硅基流動:文心 vs. DeepSeek vs. Qwen 3.0 深度測評背景百…

「日拱一碼」022 機器學習——數據劃分

目錄 基于單次隨機劃分的方法 普通單次隨機劃分(train_test_split) 分層單次隨機劃分(使用 train_test_split 的 stratify 參數) 基于多次隨機劃分的方法 普通多次隨機劃分(ShuffleSplit) 分層多次隨機劃分(StratifiedShuffleSplit…

lora網關

所需配置的引腳,SPI傳輸,PG13復位(輸出引腳,推挽輸出),PE2忙碌(輸入引腳,浮空輸入)PE6PE5輸出。若利用延時處理按鍵消抖,hal庫里用systick中斷實現延時&#…

5G IMS注冊關鍵一步:UE如何通過ePCO獲取P-CSCF地址

看似簡單的P-CSCF地址傳遞,背后是5G核心網控制面與用戶面的精密協作。ePCO作為高效的信令載體,承載著IMS業務觸達的第一把鑰匙。 在5G網絡中建立IMS PDN連接時,UE(用戶設備)獲取P-CSCF(Proxy-Call Session Control Function)地址是IMS業務(如VoLTE、VoNR)成功注冊和運…

JVM方法區的運行時常量區到底存儲哪些數據?

JDK8以后,運行時常量池邏輯上屬于方法區;但: 其中的字符串常量池實際位置移至到了java堆;其中一些符號引用也存儲到了元空間;字符串常量池,元空間,運行時常量區的具體關系請看這篇博客&#xf…

Go defer(二):從匯編的角度理解延遲調用的實現

Go的延遲調用機制會在當前函數返回前執行傳入的函數,它會經常被用于關閉文件描述符、關閉數據庫連接以及解鎖資源。之前的文章( Go defer(一):延遲調用的使用及其底層實現原理詳解 )詳細介紹了defer的使用以…

Android 12系統源碼_分屏模式(一)從最近任務觸發分屏模式

前言 打開MainActivity,然后進入最近任務觸發分屏,可以成功進入分屏模式。 本篇文章我們來具體梳理一下這個過程的源碼調用流程。 一 launcher3階段 1.1 源碼 //packages/apps/Launcher3/quickstep/src/com/android/quickstep/views/TaskView.java publi…

Flask 入門教程:用 Python 快速搭建你的第一個 Web 應用

文章目錄前言一、什么是 Flask?📌 Flask 的優勢1. 輕量靈活2. 易于上手3. 可擴展性強4. 自由度高5. 社區活躍,資料豐富Flask 主要用來做什么?二、Flask快速入門1.創建一個Flask項目2.開啟debug,修改host,端…

實習第一個小需求樣式問題總結

Vue2 vxe-table Element UI 表頭下拉詳情實現總結一、核心功能實現表頭下拉按鈕交互初始嘗試 expand-change 事件無法滿足需求&#xff0c;改用 vxe-table 的 toggle-row-expand 事件&#xff1a;<vxe-table toggle-row-expand"handleExpandChange"><temp…

Linux中LVM邏輯卷擴容

在Linux系統中對根目錄所在的LVM邏輯卷進行擴容&#xff0c;需要依次完成 物理卷擴容 ? 卷組擴容 ? 邏輯卷擴容 ? 文件系統擴容 四個步驟。以下是詳細操作流程&#xff1a;一、確認當前磁盤和LVM狀態# 1. 查看磁盤空間使用情況 df -h /# 2. 查看塊設備及LVM層級關系 lsblk# …

微軟365 PDF導出功能存在本地文件包含漏洞,可泄露敏感服務器數據

微軟365的"導出為PDF"功能近期被發現存在嚴重的本地文件包含(Local File Inclusion, LFI)漏洞&#xff0c;攻擊者可利用該漏洞獲取服務器端的敏感數據&#xff0c;包括配置文件、數據庫憑證和應用程序源代碼。該漏洞由安全研究員Gianluca Baldi發現并報告給微軟&…