物聯網之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指令測試:
操作步驟: