1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(一)

合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(一)

时间:2023-05-16 21:44:10

相关推荐

合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(一)

本篇目标

一、调通合泰单片机串口(成功接收和发送数据)

二、通过WiFi模块连接到Onenet_MQTT服务器

合泰32串口

HT32F5XXX串口

如下表所示,HT32F52352芯片USART0、USART1、UART0、UART1对应引脚号为:

值得注意的是,上表只是给出了常用的串口对应引脚。合泰单片机和STM32单片机一样,串口RX/TX引脚可以通过复用,通过其他引脚来输入输出。

如下图所示USART0 的TX和RX还可以定义成通过PC6,PC7发送和接收。

其他值得注意的地方可以参考以下这篇博文:

/LiangWF22/article/details/112482271

WiFi指令

本篇主要指令

本次需要用到的指令主要有以下几条:

注:AT+CWMODE=< mode >指令为设置WiFi应用模式,1为客户端模式。

代码实现

虽然网上关于合泰芯片资料较少,但是合泰的官网已经挂出了对应资源的代码例程了。

本篇涉及资源

一、合泰官方代码库

官网链接:/productdetail/-/vg/HT32F52342-52

链接2:/download/LiangWF22/14934274

二、合泰串口例程

链接:/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的服务器握手成功了!

工程链接

链接:/iEbgskvq6pi

以下这篇博文是接着这篇完成数据上传OneNET的,有兴趣的小伙伴可以参考一下哈:

合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(二)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。