1. 程式人生 > >物聯網之NB-IoT技術實踐開發二(NB-IoT開發環境搭建及模組驅動開發)

物聯網之NB-IoT技術實踐開發二(NB-IoT開發環境搭建及模組驅動開發)

STM32CubeMX安裝及使用

1、STM32CubeMX介紹

2、STM32CubeMX安裝

3、STM32CubeMX使用

STM32CubeMX介紹

STM32CubeMX簡介

微控制器圖形化配置

– 自動處理引腳衝突

– 動態設定確定的時鐘樹

– 可以動態確定引數設定的外圍和中介軟體模式和初始化

– 功耗預測

C程式碼工程生成器覆蓋了STM32微控制器初始化編譯軟體,如IAR,KEIL,GCC可以獨立使用,作為Eclipse外掛使用

HAL庫與STD庫

STD庫-標準外設庫

– 暫存器操作,將一些基本的暫存器操作封裝成函式

HAL庫-硬體抽象庫

– 將這些抽象成了一個抽象層,從使用的角度來看,是與硬體無關的

HAL庫優勢

– HAL庫是ST未來主推的庫,從2015開始ST新出的晶片已經沒有STD庫

– HAL庫的處理機制比STD庫好很多,HAL庫支援STM32全線產品

– HAL庫跨晶片的可移植性非常好

STM32CubeMX安裝

STM32CubeMX安裝

安裝JAVA執行環境,JavaSetup8u151.exe

安裝SetupSTM32CubeMX-4.22.0.exe,最好不要有中文路徑

載入 “stm32cube_fw_f0_v180.zip”HAL庫到STM32CubeMX中

STM32CubeMX載入韌體庫

Keil安裝及使用

1、Keil介紹

2、Keil安裝

3、Keil使用

Keil介紹

行業領先的ARM C/C++編譯工具鏈

μVision5 IDE整合開發環境,偵錯程式和模擬環境

符合CMSIS (Cortex微控制器軟體介面標準)

MDK-ARM軟體為基於Cortex-M、Cortex-R4、ARM7、ARM9處理器裝置提供了一個完整的開發環境。 MDK-ARM專為微控制器應用而設計,不僅易學易用,而且功能強大,能夠滿足大多數苛刻的嵌入式應用。

Keil安裝

安裝“MDK-523.exe”嵌入式開發環境

雙擊軟體圖示開啟軟體安裝介面:

一直點選Next,License選項框打鉤

輸入使用者、城市、電子郵件資訊

選擇安裝目錄為預設即可

點選Next,開始安裝,安裝完成後,桌面顯示

Keil破解

以管理員身份執行Keil5,在File選單下,選擇License Management,複製CID

以管理員身份執行KEIL_Lic.exe,貼上CID,選擇Target為ARM,點選Generate成註冊碼

註冊碼複製到New License ID Code下,點選Add LIC,完成破解

裝置包安裝

選擇Pack Installer 安裝裝置支援包

選擇File選單,點選Import

匯入Keil.STM32F0xx_DFP.1.4.0

STLink驅動安裝

右擊此電腦,選擇管理

選擇裝置管理器,發現其他裝置STM32 STLink

右擊STM32 STLink,選擇更新驅動程式

選擇瀏覽我的計算機…….

點選瀏覽選擇驅動目錄,win10系統選擇Window8

完成驅動安裝

NB-IoT基礎工程建立

1、原理圖分析

2、IO口、時鐘及外設配置

3、LCD驅動移植

4、Printf函式重定向

原理圖分析

分析NB-IoT核心板原理

分析一鍵還原底板原理

建立IO功能對映表

IO口、時鐘及外設配置

IO口配置

選擇IO標籤,根據IO功能對映表配置為相對應的功能

時鐘配置

選擇時鐘源為HSE(外部高頻時鐘)

配置倍頻係數為6

使能鎖相環配置系統主時鐘為48M

外設樹配置

SPI選擇全雙工主機模式

USART1選擇非同步收發模式

USART2選擇非同步收發模式

USART配置

USART1& USART2設定波特率為9600、開啟全域性中斷

SPI配置

設定資料位為8位

設定波特率為1.5MBit/s

時鐘極性為低電平驅動

時鐘相位為第一個邊沿

LCD驅動移植

LCD主要用於人機互動,動態顯示裝置資訊

相關LCD的驅動開發已在LoRa中講解,現只做移植

將下圖所示檔案新增到工程中,修改SPI初始化程式碼即可(LCD的 MISO用於資料和指令切換)

將PB4的複用功能模式更改為推輓輸出模式 

    GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;//功能複用模式
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN SPI1_MspInit 1 */
	//LCD驅動使能PB4為輸出模式
    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推輓輸出模式
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

新增標頭檔案和LCD初始化函式

#include "lcd.h"
#include <stdio.h>

Lcd_Init();
Lcd_Clear(YELLOW);

Printf函式重定向

#include <stdio.h>
int fputc(int ch, FILE *f)
{     
    while((USART1->ISR & 0X40)==0);
    USART1->TDR = (uint8_t)ch;      
    return ch;
}

AT指令集開發原理

1、什麼是AT指令集

2、NB-IoT關鍵AT指令介紹

3、串列埠透傳開發

4、AT指令測試

什麼是AT指令集

串列埠模組

AT指令集

在90年代,諾基亞、愛立信、摩托羅拉和HP共同為GSM研製了一整套AT指令

    -->GSM模組與計算機之間的通訊協議是一些AT指令集

    -->AT指令是以AT為首,字元結束的字串,AT指令的響應資料包也是一個字串

AT指令格式

DTE:AT< CR>< LF>(傳送:AT+回車+換行)(傳送方傳送指令以AT開頭,指令正確

DCE:< LF> OK < LF>(返回:換行+OK+換行)(因為上面的指令是以AT開頭,故響應資料包返回的是一個OK

DTE:ATTEST< CR>< LF>(傳送:ATTEST+回車+換行)(傳送方傳送的指令不是AT開頭,指令錯誤

DCE:< CR> ERROR < LF>(返回:回車+ERROR+換行)(因為上面的指令不是以AT開頭,故響應資料包是一個ERROR

如果AT指令執行成功,“OK”字串返回;

如果AT 指令語法錯誤或AT 指令執行失敗,“ERROR”字串返回。

NB-IoT關鍵AT指令介紹

NB-IoT初始化AT指令

AT+CFUN=0關閉射頻功能(不進行無線通訊)

AT+CFUN=1開啟射頻功能

AT+NBAND?查詢(讀取)模組配置頻段

AT+NBAND=5配置模組為電信頻段

AT+CGSN=1 查詢IMEI號(一般出廠已經設定好)

AT+CGSN=1,201612091450303 設定IMEI號

AT+NCDP=XX.XX.XX.XX 設定 IoT 平臺 IP 地址(非 COAP 協議可以不配置)

AT+NRB 軟重啟

AT+CIMI 查詢SIM卡資訊

AT+CMEE=1 開啟錯誤提示

AT+CGDCONT=1,”IP”,”ctnet”設定APN

AT+CSQ 獲取訊號質量

NB-IoT連線網路AT指令

AT+CSCON=1 設定基站連線通知

AT+CEREG=2 設定連線核心網通知

AT+NNMI=1 開啟下行資料通知

AT+CGATT=1 自動搜網

AT+NUESTATS 查詢 UE 狀態

AT+CGPADDR 查詢核心網分配的 ip 地址

NB-IoT資料收發AT指令

UDP資料收發

在傳送資料前先建立 socket:AT+NSOCR=DGRAM,17,XXXX,1 XXXX 為 SOCKET 監聽的埠號, 回覆 OK 建立成功

AT+NSOST=0,192.158.5.1,1024,2,AB30 向 192.158.5.1:1024 傳送兩位元組資料: 0xAB 0x30

+NSONMI:0,4 模組提示收到了四位元組資料

AT+NSORF=0,256 讀取接收到的資料, 最多讀取 256 個

0, 192.158.5.1,1024,4,A1A2A3A4,0 收到 192.158.5.1:1024 返回的四位元組資料 0xA1 0xA2 0xA3 0xA4

COAP資料收發

CoAP 資料傳送無需事先建立 socket(模組內部處理) , 直接傳送資料:

    -->AT+NMGS=2,A1A2 傳送 2 位元組資料, 傳送成功回覆 OK, 否則 ERROR

讀取 CoAP 資料:

    -->+NNMI:2,A1A2 收到 2 位元組 CoAP 資料

串列埠透傳開發

為了便於我們快速掌握AT指令原理:MCU充當透明傳輸,PC機直接與NB-IoT模組直接通訊(通過串列埠中斷實時收發資料)

串列埠接收中斷使能

 

uint8_t Usart1Rx = 0;
uint8_t Usart2Rx = 0;	


__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);//開啟UART1接收中斷(接收暫存器不為空則產生中斷)
	
HAL_UART_Receive_IT(&huart1, &Usart1Rx, 1);//UART1接收使能,Usart1Rx:接收資料的快取區
	
__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);//開啟UART2接收中斷(接收暫存器不為空則產生中斷)
	
HAL_UART_Receive_IT(&huart2, &Usart2Rx, 1);//UART2接收使能,Usart2Rx:接收資料的快取區

重寫串列埠中斷函式

void USART1_IRQHandler(void)
{
	//uint8_t data;
	
	if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) == SET)//判斷是否為串列埠接收中斷(是否產生UART_FLAG_RXNE標誌)
	{
		while((USART2->ISR&0x40) == 0);//判斷UART2是否傳送完成
		
		//data = USART1->RDR;
		
		USART2->TDR = USART1->RDR;//將UART1接收的資料賦值給UART2的傳送暫存器,由UART2將資料自動傳送給NB-IOT
		//USART1->TDR = data;
	}
  HAL_UART_IRQHandler(&huart1);
}

void USART2_IRQHandler(void)
{
	
	if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE) == SET)
	{
		while((USART1->ISR&0x40) == 0);
		
		USART1->TDR = USART2->RDR;//將UART2接收的資料賦值給UART1的傳送暫存器,由UART1將資料自動傳送給PC
	}
	
  HAL_UART_IRQHandler(&huart2);
}

AT指令測試

操作步驟: