关于iot:小熊派开发实践丨小熊派合宙Cat1接入云服务器

34次阅读

共计 3906 个字符,预计需要花费 10 分钟才能阅读完成。

摘要: 应用小熊派开发板,以合宙的 AIR724 为通信模组(Cat.1),以 AT 指令形式,通过 mqtt 协定接入云服务器。

本贴应用小熊派开发板 + 合宙的 Air724(Cat.1 模组),接入本人搭建的 EMQ 服务器

一、试验筹备

1. 试验环境

  • 一块 stm32 开发板(举荐应用小熊派),以及数据线
  • 曾经装置 STM32CubeMX
  • 曾经装置 KeilMDK, 并导入 stm32 开发板对应的芯片包(小熊派应用的是 STM32L431RCT6)
  • 一个 Cat.1 模块(Uart 接口,AT 指令)以及杜邦线

2. 指标成果

  • 通过 CubeMX 创立工程并配置参数
  • 通过串口 2,以 AT 指令管制通信模组
  • Cat.1 发送相应的 AT 指令接入云服务器
  • 通过 MQTT 协定,实现数据订阅、公布

二、通过 CubeMX 生产 MDK 工程

A. 芯片抉择

  • 关上 CubeMX, 进入芯片抉择:

  • 抉择本人的 stm32 芯片(即 STM32L431RCT6):

B. 时钟源 RCC 设置

  • 更改零碎时钟源

零碎时钟默认应用外部的高速时钟(HSI),抉择应用 HSE,时钟更准确

  • 设置内部时钟对应的端口

  • 配置时钟树

STM32L431RCT6 零碎时钟最大能够为 80MHz,咱们配置到最大即可

C. 参数配置(对应端口设置)

1)配置 USART1

应用 USART, 模式为异步,波特率为 115200,无硬件流控制

2)配置 UART2,连贯 Cat.1

Cat.1 模组烧录有 AT 固件,当然合宙的也反对 Luat 开发,咱们为了更不便学习,就是要 AT 指令开发

咱们应用小熊派的 Uart2,小熊派引出的引脚为 PA2->USART_TX,PA3->USART_RX

其余选项,波特率设置为 9600,其余默认即可

3)关上 Uart2 中断,并开启接管 DMA

开启中断

关上接管 DMA

最初,生成代码就 OK 了

D. 工程设置

一些根底的设置,包含工程名、存储地位、工程环境、工程中各个文件的组成

E. 生成代码

三、编写相应代码

1. 串口 1 输入重定向

咱们晓得 printf 是打印函数,原理是依据传入的字符串参数格式化打印输出到 stdout 中。咱们须要让 printf 打印到串口之中,只须要在 usart.c 文件中模拟 printf 写一个输入函数即可

  • 在增加头文件

/ USER CODE BEGIN 0 / #include <stdarg.h> #include <string.h> #include <stdio.h>
/ USER CODE END 0 / 写输入函数 / USER CODE BEGIN 1 /
void UsartPrintf(UART_HandleTypeDef huart, char fmt,…)
{

unsigned char UsartPrintfBuf[296];
va_list ap;
unsigned char *pStr = UsartPrintfBuf;

va_start(ap, fmt);
vsprintf((char *)UsartPrintfBuf, fmt, ap); // 格式化
va_end(ap); while(*pStr != 0)
{
USART1->TDR = *pStr++; while((USART1->ISR & 0x40) == 0);
}
} // 留神:在 usart.h 中增加 void UsartPrintf(UART_HandleTypeDef huart, char fmt,…);// 应用办法:UsartPrintf(&huart1;,”hello worldrn”); / USER CODE END 1 /

留神:本人增加的代码,须要在 begin 和 end 之间

2. 通信的次要代码

咱们创立两个文件,别离是 Cat1.h 和 Cat.c
同时,欠缺串口 2 的收发性能,退出串口回调函数保证数据的残缺

a). 串口回调函数

因为在进行发送 AT 指令后,承受的数据要进行解决;一方处理速度跟不上,因而退出一个串口回调函数

// 串口回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART2)

{if(Usart2type.UsartRecLen>0)            // 证实还有未实现数据 

{

        memcpy(&Usart2type.Usart2RecBuffer[Usart2type.UsartRecLen],Usart2type.Usart2DMARecBuffer,Usart2type.UsartDMARecLen); // 转存到待处理区域
        Usart2type.UsartRecLen += Usart2type.UsartDMARecLen;
    } else {memcpy(Usart2type.Usart2RecBuffer,Usart2type.Usart2DMARecBuffer,Usart2type.UsartDMARecLen); // 转存到待处理区域
        Usart2type.UsartRecLen = Usart2type.UsartDMARecLen;
    }
    memset(Usart2type.Usart2DMARecBuffer, 0x00, sizeof(Usart2type.Usart2DMARecBuffer));                                     // 先清空 DMA 缓冲区
    Usart2type.UsartRecFlag = 1;
}

}

b). 串口 2 闲暇中断

当发送或承受实现一组数据后,进入闲暇中断

函数如下

void USART2_IRQHandler(void)
{/ USER CODE BEGIN USART2_IRQn 0 /
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) ==SET) // 触发闲暇中断
{

    uint16_t temp = 0;                        
    __HAL_UART_CLEAR_IDLEFLAG(&huart2);       // 革除串口 2 闲暇中断标记位
    HAL_UART_DMAStop(&huart2);                // 敞开 DMA
    temp = huart2.Instance->ISR;              // 革除 SR 状态寄存器  F0  ISR
    temp = huart2.Instance->RDR;              // 读取 DR 数据寄存器 F0  RDR    用来革除中断
    temp = hdma_usart2_rx.Instance->CNDTR;    // 获取 DMA 中未传输的数据个数
    Usart2type.UsartDMARecLen = USART2_DMA_REC_SIE - temp;           // 总计数减去未传输的数据个数,失去曾经接管的数据个数
    HAL_UART_RxCpltCallback(&huart2);          // 串口接管回调函数 

} / USER CODE END USART2_IRQn 0 / HAL_UART_IRQHandler(&huart2); / USER CODE BEGIN USART2_IRQn 1 / HAL_UART_Receive_DMA(&huart2,Usart2type.Usart2DMARecBuffer,USART2_DMA_REC_SIE); // 从新关上 DMA 接管

/ USER CODE END USART2_IRQn 1 / }

C).AT 指令通信流程

次要的 AT 指令如下

tsATCmds ATCmds[] = {

{"ATrn","OK",200,NO_REC,10},  // 测试 

{“AT+CIMIrn”,”4600″,200,NO_REC,10}, // 挪动卡号
{“AT+CSQrn”,”+CSQ”,200,NO_REC,10}, // 信号
{“AT+CEREG?rn”,”+CEREG: 0,1″,200,NO_REC,10}, // 网络
{“AT+CGATT?rn”,”+CGATT:1″,200,NO_REC,10}, // 驻网
{“AT+CCLK?rn”,”+CCLK”,200,NO_REC,10}, // 工夫
{“AT+MCONFIG=0001,door,2020rn”,”OK”,200,NO_REC,10}, //MQTT 参数 //{“AT+MCONFIG=111,device1,123456rn”,”OK”,200,NO_REC,100},

{"AT+MDISCONNECTrn","",200,NO_REC,5},  // 断开 MQTT 连贯 

{“AT+MIPCLOSErn”,””,200,NO_REC,5}, // 断开 TCP 连贯

{"AT+MIPSTART=123.56.117.8,1883rn","CONNECT OK",200,NO_REC,5},  // 建设 TCP 连贯 

{“AT+MCONNECT=1,60rn”,”CONNACK OK”,200,NO_REC,5}, // 建设 MQTT 连贯
{“AT+MSUB=”,”SUBACK”,200,NO_REC,5}, // 订阅主题
{“AT+MPUB=”,”OK”,200,NO_REC,5}, // 公布主题
{“AT+MQTTSTATUrn”,”+MQTTSTATU”,200,NO_REC,5}, // 状态 //AT+MQTTSTATU 0- 离线 1- 失常 2- 需发送 MCONNECT

{"AT+RESETrn","",200,NO_REC,5}// 重启 

};

四、编译 + 下载

点击编译后,0 error,0 warning

小熊派连贯在电脑上,代码下载到开发板

五、连贯硬件

1. 将 Cat.1 的 uart1_tx 连贯小熊派 uart2_rx,cat.1 的 uart1_rx 连贯小熊派 uart2_tx;Gnd 连 Gnd;

留神:肯定要连贯 GND 哦,须要共地的。

2. 调试

此时,咱们进行最初一次调试;将小熊派串口 1 用作串口打印,关上串口调试助手,查看运行状态(在每次发送指令后进行 printf() 打印相应信息)。

附件中蕴含 CubeMX 工程、MDK 工程

下一步,打算将此设施接入华为云 IoTDA,更好的实现设施治理

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0