合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(一)
本篇目标
一、调通合泰单片机串口(成功接收和发送数据)
二、通过WiFi模块连接到Onenet_MQTT服务器
合泰32串口
HT32F5XXX串口
如下表所示,HT32F52352芯片USART0、USART1、UART0、UART1对应引脚号为:
—— | TX | RX |
---|---|---|
USART0 | PA4 | PA5 |
USART1 | PA2 | PA3 |
UART0 | PC4 | PC5 |
UART1 | PC12 | PC13 |
值得注意的是,上表只是给出了常用的串口对应引脚。合泰单片机和STM32单片机一样,串口RX/TX引脚可以通过复用,通过其他引脚来输入输出。
如下图所示USART0 的TX和RX还可以定义成通过PC6,PC7发送和接收。
其他值得注意的地方可以参考以下这篇博文:
https://blog.csdn.net/LiangWF22/article/details/112482271
WiFi指令
本篇主要指令
本次需要用到的指令主要有以下几条:
指令 | 作用 |
---|---|
AT | AT |
AT+CWMODE=1 | 设置WiFi模块应用模式(具体数值对应的模式,请看下图) |
AT+CWJAP=“ESP8266”,“11111111” | 接入WiFi,前面的参数为WiFi名称,后面的为WiFi密码 |
AT+CIPSTART=“TCP”,“183.230.40.39”,6002 | 连接到Onenet_MQTT服务器 |
注:AT+CWMODE=< mode >指令为设置WiFi应用模式,1为客户端模式。
代码实现
虽然网上关于合泰芯片资料较少,但是合泰的官网已经挂出了对应资源的代码例程了。
本篇涉及资源
一、合泰官方代码库
官网链接:https://www.holtek.com.cn/productdetail/-/vg/HT32F52342-52
链接2:https://download.csdn.net/download/LiangWF22/14934274
二、合泰串口例程
链接:https://leoeinstein.lanzous.com/ifVM0kvl5tg
修改代码(做一个努力的搬砖人)
打开合泰官方的程序文件,依次点击以下文件
HT32_STD_5xxxx_FWLib_v017_5137 -example -USART - Interrupt_FIFO 你就会看到如下图所示的内容,右键点击main.c用keil软件打开,稍微修改以下就可以作为usart.c使用了。
当然了,除了可以用Interrupt_FIFO,我们同样也可以使用Interrupt里面的程序来用。
同样右键点击ht32f5xxxx_01_it.c文件,里面有一个中断处理函数,稍微修改以下就可以作为我们的串口接收或者发送中断的服务函数了。
串口初始化设置
修改后的usart.c(部分)程序如下:
void USART0_Configuration(void) from usart.c
/**************************实现函数********************************************
函数说明:配置usart串口*******************************************************************************/
void USART0_Configuration(void)
{HT32F_DVB_LEDInit(HT_LED1);HT32F_DVB_LEDInit(HT_LED2);gURRx_Ptr = gRx_Buffer;#if 0 // Use following function to configure the IP clock speed.// The UxART IP clock speed must be faster 16x then the baudrate.CKCU_SetPeripPrescaler(CKCU_PCLK_UxARTn, CKCU_APBCLKPRE_DIV2);#endif{CKCU_PeripClockConfig_TypeDef CKCUClock= {{0}};CKCUClock.Bit.AFIO = 1;CKCUClock.Bit.PA=1;COM0_CLK(CKCUClock) = 1; //开启COM0 时钟CKCU_PeripClockConfig(CKCUClock, ENABLE);}GPIO_PullResistorConfig(HT_GPIOA, GPIO_PIN_3, GPIO_PR_UP);AFIO_GPxConfig(USART_GPIO_GROUP, USART_TX_PIN, AFIO_FUN_USART_UART);AFIO_GPxConfig(USART_GPIO_GROUP, USART_RX_PIN, AFIO_FUN_USART_UART);/*波特率: 115200长度: 8bits停止位: 1位校验位: 无 模式: 正常模式*/USART_InitTypeDef USART_InitStructure={0};USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B;USART_InitStructure.USART_StopBits = USART_STOPBITS_1;USART_InitStructure.USART_Parity = USART_PARITY_NO;USART_InitStructure.USART_Mode = USART_MODE_NORMAL;USART_Init(COM0_PORT, &USART_InitStructure);//Enable 中断设置 NVIC_EnableIRQ(COM0_IRQn);// Enable UxART Tx and Rx interrupt USART_IntConfig(COM0_PORT, USART_INT_RXDR , ENABLE);USART_IntConfig(COM0_PORT, USART_INT_TOUT , ENABLE);/* 设置FIFO接收等级 */USART_RXTLConfig(COM0_PORT, USART_RXTL_04);USART_TXTLConfig(COM0_PORT, USART_TXTL_02);USART_SetTimeOutValue(COM0_PORT,0X7F);// 使能 COM1_PORT 发送和接收 USART_TxCmd(COM0_PORT, ENABLE);USART_RxCmd(COM0_PORT, ENABLE);}
串口中断服务函数
在startup_ht32f5xxxx_01.s文件中我们可以看到USART0的中断服务函数是 void USART0_IRQHandler(void),当然合泰里面写成void COM1_IRQHandler(void)也是可以的。
void USATR0_IRQHandler(void) from usart.c
。
//==========================================================
// 函数名称: USATR0_IRQHandler
//
// 函数功能: 串口接收中断
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
//==========================================================
void USART0_IRQHandler(void)
{bool bIsRxDataReady = FALSE;#if (DEBUG_IO == 1)#define DBG_IO1_LO() HT32F_DVB_LEDOn(HT_LED1)#define DBG_IO1_HI() HT32F_DVB_LEDOff(HT_LED1)#define DBG_IO2_LO() HT32F_DVB_LEDOn(HT_LED2)#define DBG_IO2_HI() HT32F_DVB_LEDOff(HT_LED2)
#else#define DBG_IO1_LO(...)#define DBG_IO1_HI(...)#define DBG_IO2_LO(...)#define DBG_IO2_HI(...)
#endif/* Timeout: Clear Timeout Flag */if (USART_GetFlagStatus(HT_USART0, USART_FLAG_TOUT)){USART_ClearFlag(HT_USART0, USART_FLAG_TOUT);bIsRxDataReady = TRUE;DBG_IO1_HI(); // Note: The width of the latest Rx byte Stop bit and IO HI is the timeout timming.}/* Rx FIFO level is reached */if (USART_GetFlagStatus(HT_USART0, USART_FLAG_RXDR)){bIsRxDataReady = TRUE;DBG_IO1_LO();}/* Rx: Move data from USART FIFO to buffer */if (bIsRxDataReady == TRUE){while (USART_GetFIFOStatus(HT_USART0, USART_FIFO_RX)){gURRx_Ptr[gURRx_Length++] = USART_ReceiveData(HT_USART0);#if 0if (gURRx_Length == 128){while (1) {}; // Rx Buffer full}#endif}}/* Tx, move data from buffer to USART FIFO */if (USART_GetIntStatus(HT_USART0, USART_INT_TXDE) &&USART_GetFlagStatus(HT_USART0, USART_FLAG_TXDE)){#if 0 // Write fixed length to FIFO// FIFO depth = 8, trigger level = 2, send (8 - 2) = 6 byteDBG_IO2_LO();if (gURTx_Length < 6){while (gURTx_Length){USART_SendData(HTCFG_UART_PORT, *gURTx_Ptr++);gURTx_Length--;}}else{USART_SendData(HTCFG_UART_PORT, *gURTx_Ptr++);USART_SendData(HTCFG_UART_PORT, *gURTx_Ptr++);USART_SendData(HTCFG_UART_PORT, *gURTx_Ptr++);USART_SendData(HTCFG_UART_PORT, *gURTx_Ptr++);USART_SendData(HTCFG_UART_PORT, *gURTx_Ptr++);USART_SendData(HTCFG_UART_PORT, *gURTx_Ptr++);gURTx_Length -= 6;}if (gURTx_Length == 0){USART_IntConfig(HTCFG_USART_PORT, USART_INT_TXDE, DISABLE);}DBG_IO2_HI();#else // Write until FIFO fullDBG_IO2_LO();while (USART_GetFIFOStatus(HT_USART0, USART_FIFO_TX) != 8){USART_SendData(HT_USART0, *gURTx_Ptr++);gURTx_Length--;if (gURTx_Length == 0){USART_IntConfig(HT_USART0, USART_INT_TXDE, DISABLE);break;}}DBG_IO2_HI();#endif}if (USART_GetIntStatus(HT_USART0, USART_INT_TXC) &&USART_GetFlagStatus(HT_USART0, USART_FLAG_TXC)){USART_IntConfig(HT_USART0, USART_INT_TXC, DISABLE);gIsTxFinished = TRUE;}}
WiFi初始化函数
相信大家对于WiFi模块的初始化已经比较熟悉了,在本次实验里我用PA9作为RST端,如果和你现有工程冲突的话,可以随意设置。
void ESP8266_Init(void) from esp8266.c
//==========================================================
// 函数名称: ESP8266_Init
//
// 函数功能: 初始化ESP8266
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
//==========================================================
void ESP8266_Init(void)
{CKCU_PeripClockConfig_TypeDef CLOCK={{0}};CLOCK.Bit.PA=1;CLOCK.Bit.AFIO=1;CKCU_PeripClockConfig(CLOCK,ENABLE);//HT_GPIO_InitTypeDef GPIO_Initure;GPIO_PullResistorConfig(HT_GPIOA,ESP8266_RST,GPIO_PR_UP);GPIO_DriveConfig(HT_GPIOA,ESP8266_RST,GPIO_DV_8MA);GPIO_DirectionConfig(HT_GPIOA,ESP8266_RST,GPIO_DIR_OUT);WIFI_Clr();delay_ms(250);WIFI_Set();delay_ms(500);ESP8266_Clear();while(ESP8266_SendCmd("AT\r\n", "OK"))delay_ms(5000);while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))delay_ms(5000);while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))delay_ms(5000);while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))delay_ms(5000);}
目标实现效果
将程序下载到合泰单片机上,复位,观察串口输出,直到串口输出 “ALREADY CONNECTED” ,如果看到这句话则恭喜你,已经与Onenet的服务器握手成功了!
工程链接
链接:https://leoeinstein.lanzous.com/iEbgskvq6pi
以下这篇博文是接着这篇完成数据上传OneNET的,有兴趣的小伙伴可以参考一下哈:
合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(二)
合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(一)相关推荐
- 合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(二)
本篇目标 一.学习MQTT协议 二.发送温度湿度数据到OneNET 准备材料 感觉麻烦的小伙伴请移步到文末,那里有整个工程的链接. (关于串口和WiFi部分的内容,可以查看前一篇博文,链接:这个是传送 ...
- Arduino--ESP8266物联网WIFI模块(贝壳物联)--数据上传服务器(单数据接口)
一.简介 随着移动物联网的发展,各场景下对于物联控制.数据上传.远程控制的诉求也越来越多,基于此乐鑫科技推出了便宜好用性价比极高的wifi物联模块--ESP8266,话不多少我们先来看看这个神奇的模块 ...
- 基于STM32单片机采集数据数据上云
前言 以往采集数据均是采用Arduino开发板.esp32wifi模块等,本次实验采用的是STM32单片机,STM32系列基于专为要求高性能.低成本.低功耗的嵌入式应用专门设计的ARM Cortex- ...
- STM32MP157实现串口接收数据上云-MP157连接4G模块和电脑
文章目录 前言 一.打开设备文件 二.串口初始化 三.多线程 四.程序的移植和执行 五.源码(转载请注明出处) 结语 前言 本篇分享: 这次将会用几篇博客分享STM32MP157实现串口接收数据上云的 ...
- 数据上云|OneMO DTU数传模组接入OneNET云平台操作详细过程
目录 前言 第一步.OneNET云平台基础搭建 第二步.DTU数传模组参数配置 第三步.成果展示 友友们,我要不再买一块补个仓,拉低成本?! 前言 最近在做物联网实训项目,要求将传感器的数据采集上传到 ...
- wifi模块和云端服务器的协议,wifi模块连接云端服务器的尝试(esp8266连thingSpeak)
本帖最后由 gada888 于 2017-3-31 13:28 编辑 前几天看到一个贴子说想用无线方式浇花,本人还和人家探讨,后来一想,自己都没做过,说的不跟空话一样,于是就是试着调试了一下wifi模 ...
- (过程超详细)适合新手的ATK-ESP8266+STM32F103系列单片机通过MQTT协议直连阿里云的教程
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.所用到的硬件设备 二.调试步骤 1.固件的烧录 2.创造阿里云的产品 3.代码修改 4.最终的硬件连接及效果图 总 ...
- mqtt 域名连接_中国移动OneNet物联网平台,如何使用MQTT协议,进行连接
大家好,超子又和大家见面了,超子我能力有限,技术不高,有什么错误的地方,欢迎板砖.今天我们一起构建MQTT协议中的CONNECT报文,连接OneNet物联网平台,然后进行通信.前面的文章中,超子介绍阿 ...
- 设备接入ONENET(2)STM32 + ESP8266(MQTT协议)接入云 :使用 OneNET 官方麒麟座开发板例程
重要提示:由于OneNET版本迭代,导致鉴权方式可能变更,若程序无法连接,请参考官方手册或再OneNET论坛搜索相关内容 一.麒麟镇官方资料 麒麟座官方资料整理帖子:开发板资料下载,(长期更新,首次使 ...
最新文章
- python psutils
- FastDfs上传图片时报错configparser.NoOptionError: No option ‘connect_timeout‘ in section: ‘__config__‘
- 技嘉主板GA-B85M-D3V PLUS 1150组装问题汇总
- attr和prop的区别以及在企业开发中应该如何抉择
- error restore 01
- 开通此博客的目的主要用于发布一些技术方面的文章
- 动态规划经典问题:背包问题
- http://blog.csdn.net/evankaka/article/details/45155047
- Vue 监听浏览器页面窗口切换, 窗口最小化
- Java Lambda 归约 reduce
- 关于画法几何和机械制图有感
- 只要一行代码,批量将Word转换为PDF!
- 赚自己的淘宝佣金,让返利网无路可走
- Istio学习笔记-熔断实验
- 软件设计师近10年上午真题解析知识点(并非绝对完整版)
- CTF也需要了解点电脑系统还原点
- Banana PI (香蕉派) 安装 ubuntu-core-14 最小核心的操作步骤
- 微信小程序用户头像编辑上传
- 网络通信协议是什么?
- 面向异构众核超级计算机的大规模稀疏计算性能优化研究
热门文章
- Gambit 命令之 dgui
- 2、igraph的简单实战
- 手机病毒的剖析与防治
- 如何让U盘同时兼容Windows和Mac OS X系统
- windows11 Vmware16.2 挂起报错Workstation unrecoverable error: (vcpu-0)
- [NOIP2017 普及组]跳房子 【题解】
- SpringBoot2.0整合Redis实战
- 【12月学习进度3/31—计算机图形学期末准备01】拉格朗日插值 + 三次Hermite插值
- R16 5G NR Two-Step RACH
- 基于UniGUI的管理系统