woshiashuai 3 lat temu
rodzic
commit
548dc3f12a

+ 2 - 1
README.md

@@ -1 +1,2 @@
-STM32F1x系列工程模板、模块模板、外设模板
+# STM32F1x系列工程模板、模块模板、外设模板
+

+ 14 - 0
module_Template/OneNET/AllHeaderFileName.txt

@@ -0,0 +1,14 @@
+// ST lib
+#include "stm32f10x.h"
+// C lib
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+// system
+#include "DELAY.h"
+#include "USART.h"
+// onenet
+#include "Common.h"
+#include "ESP8266.h"
+#include "MqttKit.h"
+#include "onenet.h"

+ 17 - 0
module_Template/OneNET/Common.h

@@ -0,0 +1,17 @@
+#ifndef __COMMON_H__
+#define __COMMON_H__
+
+/*---------------------------------------------------------------------------*/
+/* Type Definition Macros                                                    */
+/*---------------------------------------------------------------------------*/
+
+	typedef _Bool			uint1;
+    typedef unsigned char   uint8;
+    typedef char			int8;
+    typedef unsigned short  uint16;
+    typedef short			int16;
+    typedef unsigned int    uint32;
+    typedef int				int32;
+	typedef unsigned int	size_t;
+	
+#endif /* __COMMON_H__ */

+ 204 - 0
module_Template/OneNET/ESP8266.c

@@ -0,0 +1,204 @@
+#include "main.h"
+//#include "stm32f10x.h"
+//#include "ESP8266.h"
+//#include "delay.h"
+//#include "usart.h"
+//#include <string.h>
+//#include <stdio.h>
+
+#define ESP8266_GPIO_PORT    	GPIOA			              /* GPIO端口 */
+#define ESP8266_GPIO_CLK 	    RCC_APB2Periph_GPIOA		/* GPIO端口时钟 */
+#define ESP8266_GPIO_PIN			GPIO_Pin_1			        /* 连接到SCL时钟线的GPIO */
+#define ESP8266_UART					USART2									/* 串口号 */
+// WIFI信息配置
+#define ESP8266_WIFI_INFO			"AT+CWJAP=\"MNIAS\",\"0123456789\"\r\n"
+// TCP信息配置 默认不更改
+#define ESP8266_ONENET_INFO		"AT+CIPSTART=\"TCP\",\"183.230.40.39\",6002\r\n"
+
+unsigned char ESP8266_buf[128];
+unsigned short ESP8266_cnt = 0, ESP8266_cntPre = 0;
+
+
+/**
+  * @brief  OneNET使用串口的串口中断函数
+  * @param  None
+  * @retval None
+  */
+void USART2_IRQHandler(void)
+{
+	if(USART_GetITStatus(ESP8266_UART, USART_IT_RXNE) != RESET)
+	{
+		
+		if(ESP8266_cnt >= sizeof(ESP8266_buf))	ESP8266_cnt = 0; //防止串口被刷爆
+		ESP8266_buf[ESP8266_cnt++] = ESP8266_UART->DR;
+		
+		USART_ClearFlag(ESP8266_UART, USART_FLAG_RXNE);
+	}
+}
+/**
+  * @brief  ESP8266初始化
+  * @param  None
+  * @retval None
+  */
+void ESP8266_Init(void)
+{
+	GPIO_InitTypeDef GPIO_Initure;
+	RCC_APB2PeriphClockCmd(ESP8266_GPIO_CLK, ENABLE);
+	// ESP8266复位引脚
+	GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
+	GPIO_Initure.GPIO_Pin = ESP8266_GPIO_PIN;					
+	GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
+	GPIO_Init(ESP8266_GPIO_PORT, &GPIO_Initure);
+	
+	GPIO_WriteBit(ESP8266_GPIO_PORT, ESP8266_GPIO_PIN, Bit_RESET);
+	DELAYClass.DelayMs(250);
+	GPIO_WriteBit(ESP8266_GPIO_PORT, ESP8266_GPIO_PIN, Bit_SET);
+	DELAYClass.DelayMs(500);
+	
+	ESP8266_Clear();
+#ifdef DEBUG_printf
+	printf("1. AT\r\n");
+#endif
+	while(ESP8266_SendCmd("AT\r\n", "OK")) DELAYClass.DelayMs(500);
+#ifdef DEBUG_printf
+	printf("2. CWMODE\r\n");
+#endif
+	while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK")) DELAYClass.DelayMs(500);
+//	printf( "3.AT+CWSTARTSMART=3\r\n");//支持ESP-Touch和Airkiss智能配网
+//	while(ESP8266_SendCmd("AT+CWSTARTSMART=3\r\n", "GOT IP")) DELAYClass.DelayMs(500);
+#ifdef DEBUG_printf
+	printf("4. AT+CWDHCP\r\n");
+#endif
+	while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK")) DELAYClass.DelayMs(500);
+#ifdef DEBUG_printf
+	printf("5. CWJAP\r\n");
+#endif
+	while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP")) DELAYClass.DelayMs(500);
+#ifdef DEBUG_printf	
+	printf("6. CIPSTART\r\n");
+#endif
+	while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT")) DELAYClass.DelayMs(500);
+#ifdef DEBUG_printf
+	printf("7. ESP8266 Init OK\r\n");
+#endif
+}
+/**
+  * @brief  清空WIFI串口缓存区
+  * @param  None
+  * @retval None
+  */
+void ESP8266_Clear(void)
+{
+	memset(ESP8266_buf, 0, sizeof(ESP8266_buf));
+	ESP8266_cnt = 0;
+}
+/**
+  * @brief  等待接收完成
+  * @param  None
+  * @retval REV_OK-接收完成		REV_WAIT-接收超时未完成
+	* @note   循坏调用检测是否接收完成
+  */
+_Bool ESP8266_WaitRecive(void)
+{
+
+	if(ESP8266_cnt == 0) 							//如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
+		return REV_WAIT;
+
+	if(ESP8266_cnt == ESP8266_cntPre)				//如果上一次的值和这次相同,则说明接收完毕
+	{
+		ESP8266_cnt = 0;							//清0接收计数
+			
+		return REV_OK;								//返回接收完成标志
+	}
+
+	ESP8266_cntPre = ESP8266_cnt;					//置为相同
+	
+	return REV_WAIT;								//返回接收未完成标志
+
+}
+/**
+  * @brief  向WIFI串口发送命令
+  * @param  cmd:命令字符串
+	* @param  res:期待返回的内容
+  * @retval 0-成功	1-失败
+	* @note   None
+  */
+_Bool ESP8266_SendCmd(char *cmd, char *res)
+{
+	unsigned char timeOut = 200;
+
+	USARTClass.USART_SendString1(ESP8266_UART, (unsigned char *)cmd, strlen((const char *)cmd));
+
+	while(timeOut--)
+	{
+		// 如果收到数据
+		if(ESP8266_WaitRecive() == REV_OK)							
+		{
+			// 如果检索到关键词
+			if(strstr((const char *)ESP8266_buf, res) != NULL)
+			{
+				ESP8266_Clear(); // 清空缓存
+				return 0;
+			}
+		}
+		DELAYClass.DelayMs(10);
+	}
+	return 1;
+}
+/**
+  * @brief  向WIFI串口TCP发送数据
+  * @param  data:数据字符串
+	* @param  len:长度
+  * @retval None
+	* @note   None
+  */
+void ESP8266_SendData(unsigned char *data, unsigned short len)
+{
+	char cmdBuf[32];
+	
+	ESP8266_Clear();								//清空接收缓存
+	sprintf(cmdBuf, "AT+CIPSEND=%d\r\n", len);		//发送命令
+	if(!ESP8266_SendCmd(cmdBuf, ">"))				//收到‘>’时可以发送数据
+	{
+		USARTClass.USART_SendString1(ESP8266_UART, data, len);		//发送设备连接请求数据
+	}
+}
+/**
+  * @brief  获取平台返回的数据
+  * @param  timeOut:等待的时间(乘以10ms)
+  * @retval 平台返回的原始数据
+	* @note   不同网络设备返回的格式不同,需要去调试如ESP8266的返回格式为	"+IPD,x:yyy"	x代表数据长度,yyy是数据内容
+  */
+unsigned char *ESP8266_GetIPD(unsigned short timeOut)
+{
+	char *ptrIPD = NULL;
+	
+	do
+	{
+		if(ESP8266_WaitRecive() == REV_OK)								//如果接收完成
+		{
+			ptrIPD = strstr((char *)ESP8266_buf, "IPD,");				//搜索“IPD”头
+			if(ptrIPD == NULL)											//如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间
+			{
+				//printf( "\"IPD\" not found\r\n");
+			}
+			else
+			{
+				ptrIPD = strchr(ptrIPD, ':');							//找到':'
+				if(ptrIPD != NULL)
+				{
+					ptrIPD++;
+					return (unsigned char *)(ptrIPD);
+				}
+				else
+				{
+					return NULL;
+				}
+			}
+		}
+		
+		DELAYClass.DelayMs(5);													//延时等待
+	} while(timeOut--);
+	
+	return NULL;														//超时还未找到,返回空指针
+}

+ 19 - 0
module_Template/OneNET/ESP8266.h

@@ -0,0 +1,19 @@
+#ifndef _ESP8266_H_
+#define _ESP8266_H_
+
+#include "main.h"
+
+#define REV_OK		0	//接收完成标志
+#define REV_WAIT	1	//接收未完成标志
+
+extern unsigned char ESP8266_buf[128];
+
+void ESP8266_Init(void);
+void ESP8266_Clear(void);
+_Bool ESP8266_WaitRecive(void);
+_Bool ESP8266_SendCmd(char *cmd, char *res);
+void ESP8266_SendData(unsigned char *data, unsigned short len);
+unsigned char *ESP8266_GetIPD(unsigned short timeOut);
+
+
+#endif

+ 1372 - 0
module_Template/OneNET/MqttKit.c

@@ -0,0 +1,1372 @@
+/**
+	************************************************************
+	************************************************************
+	************************************************************
+	*	文件名: 	MqttKit.c
+	*
+	*	作者: 		张继瑞
+	*
+	*	日期: 		2018-04-27
+	*
+	*	版本: 		V1.6
+	*
+	*	说明: 		MQTT协议
+	*
+	*	修改记录:	V1.1:解决MQTT_PacketSubscribe订阅不为2个topic
+	*						个数时协议错误的bug
+	*				V1.2:修复MQTT_PacketCmdResp的bug
+	*				V1.3:将strncpy替换为memcpy,解决潜在bug
+	*				V1.4:修复	MQTT_PacketPublishAck
+	*							MQTT_PacketPublishRel
+	*							函数封包错误的bug
+	*				V1.5:增加	MQTT_UnPacketCmd
+	*							MQTT_UnPacketPublish
+	*							接口对消息内容长度的提取参数
+	*				V1.6:增加二进制文件上传接口
+	************************************************************
+	************************************************************
+	************************************************************
+**/
+#include "main.h"
+//#include "MqttKit.h"
+//#include <string.h>
+//#include <stdio.h>
+
+
+#define CMD_TOPIC_PREFIX		"$creq"
+
+
+//==========================================================
+//	函数名称:	EDP_NewBuffer
+//
+//	函数功能:	申请内存
+//
+//	入口参数:	edpPacket:包结构体
+//				size:大小
+//
+//	返回参数:	无
+//
+//	说明:		1.可使用动态分配来分配内存
+//				2.可使用局部或全局数组来指定内存
+//==========================================================
+void MQTT_NewBuffer(MQTT_PACKET_STRUCTURE *mqttPacket, uint32 size)
+{
+	
+	uint32 i = 0;
+
+	if(mqttPacket->_data == NULL)
+	{
+		mqttPacket->_memFlag = MEM_FLAG_ALLOC;
+		
+		mqttPacket->_data = (uint8 *)MQTT_MallocBuffer(size);
+		if(mqttPacket->_data != NULL)
+		{
+			mqttPacket->_len = 0;
+			
+			mqttPacket->_size = size;
+			
+			for(; i < mqttPacket->_size; i++)
+				mqttPacket->_data[i] = 0;
+		}
+	}
+	else
+	{
+		mqttPacket->_memFlag = MEM_FLAG_STATIC;
+		
+		for(; i < mqttPacket->_size; i++)
+			mqttPacket->_data[i] = 0;
+		
+		mqttPacket->_len = 0;
+		
+		if(mqttPacket->_size < size)
+			mqttPacket->_data = NULL;
+	}
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_DeleteBuffer
+//
+//	函数功能:	释放数据内存
+//
+//	入口参数:	edpPacket:包结构体
+//
+//	返回参数:	无
+//
+//	说明:		
+//==========================================================
+void MQTT_DeleteBuffer(MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+
+	if(mqttPacket->_memFlag == MEM_FLAG_ALLOC)
+		MQTT_FreeBuffer(mqttPacket->_data);
+	
+	mqttPacket->_data = NULL;
+	mqttPacket->_len = 0;
+	mqttPacket->_size = 0;
+	mqttPacket->_memFlag = MEM_FLAG_NULL;
+
+}
+
+int32 MQTT_DumpLength(size_t len, uint8 *buf)
+{
+	
+	int32 i = 0;
+	
+	for(i = 1; i <= 4; ++i)
+	{
+		*buf = len % 128;
+		len >>= 7;
+		if(len > 0)
+		{
+			*buf |= 128;
+			++buf;
+		}
+		else
+		{
+			return i;
+		}
+	}
+
+	return -1;
+}
+
+int32 MQTT_ReadLength(const uint8 *stream, int32 size, uint32 *len)
+{
+	
+	int32 i;
+	const uint8 *in = stream;
+	uint32 multiplier = 1;
+
+	*len = 0;
+	for(i = 0; i < size; ++i)
+	{
+		*len += (in[i] & 0x7f) * multiplier;
+
+		if(!(in[i] & 0x80))
+		{
+			return i + 1;
+		}
+
+		multiplier <<= 7;
+		if(multiplier >= 2097152)		//128 * *128 * *128
+		{
+			return -2;					// error, out of range
+		}
+	}
+
+	return -1;							// not complete
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_UnPacketRecv
+//
+//	函数功能:	MQTT数据接收类型判断
+//
+//	入口参数:	dataPtr:接收的数据指针
+//
+//	返回参数:	0-成功		其他-失败原因
+//
+//	说明:		
+//==========================================================
+uint8 MQTT_UnPacketRecv(uint8 *dataPtr)
+{
+	
+	uint8 status = 255;
+	uint8 type = dataPtr[0] >> 4;				//类型检查
+	
+	if(type < 1 || type > 14)
+		return status;
+	
+	if(type == MQTT_PKT_PUBLISH)
+	{
+		uint8 *msgPtr;
+		uint32 remain_len = 0;
+		
+		msgPtr = dataPtr + MQTT_ReadLength(dataPtr + 1, 4, &remain_len) + 1;
+		
+		if(remain_len < 2 || dataPtr[0] & 0x01)					//retain
+			return 255;
+		
+		if(remain_len < ((uint16)msgPtr[0] << 8 | msgPtr[1]) + 2)
+			return 255;
+		
+		if(strstr((int8 *)msgPtr + 2, CMD_TOPIC_PREFIX) != NULL)	//如果是命令下发
+			status = MQTT_PKT_CMD;
+		else
+			status = MQTT_PKT_PUBLISH;
+	}
+	else
+		status = type;
+	
+	return status;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketConnect
+//
+//	函数功能:	连接消息组包
+//
+//	入口参数:	user:用户名:产品ID
+//				password:密码:鉴权信息或apikey
+//				devid:设备ID
+//				cTime:连接保持时间
+//				clean_session:离线消息清除标志
+//				qos:重发标志
+//				will_topic:异常离线topic
+//				will_msg:异常离线消息
+//				will_retain:消息推送标志
+//				mqttPacket:包指针
+//
+//	返回参数:	0-成功		其他-失败
+//
+//	说明:		
+//==========================================================
+uint8 MQTT_PacketConnect(const int8 *user, const int8 *password, const int8 *devid,
+						uint16 cTime, uint1 clean_session, uint1 qos,
+						const int8 *will_topic, const int8 *will_msg, int32 will_retain,
+						MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+	
+	uint8 flags = 0;
+	uint8 will_topic_len = 0;
+	uint16 total_len = 15;
+	int16 len = 0, devid_len = strlen(devid);
+	
+	if(!devid)
+		return 1;
+	
+	total_len += devid_len + 2;
+	
+	//断线后,是否清理离线消息:1-清理	0-不清理--------------------------------------------
+	if(clean_session)
+	{
+		flags |= MQTT_CONNECT_CLEAN_SESSION;
+	}
+	
+	//异常掉线情况下,服务器发布的topic------------------------------------------------------
+	if(will_topic)
+	{
+		flags |= MQTT_CONNECT_WILL_FLAG;
+		will_topic_len = strlen(will_topic);
+		total_len += 4 + will_topic_len + strlen(will_msg);
+	}
+	
+	//qos级别--主要用于PUBLISH(发布态)消息的,保证消息传递的次数-----------------------------
+	switch((unsigned char)qos)
+	{
+		case MQTT_QOS_LEVEL0:
+			flags |= MQTT_CONNECT_WILL_QOS0;							//最多一次
+		break;
+		
+		case MQTT_QOS_LEVEL1:
+			flags |= (MQTT_CONNECT_WILL_FLAG | MQTT_CONNECT_WILL_QOS1);	//最少一次
+		break;
+		
+		case MQTT_QOS_LEVEL2:
+			flags |= (MQTT_CONNECT_WILL_FLAG | MQTT_CONNECT_WILL_QOS2);	//只有一次
+		break;
+		
+		default:
+		return 2;
+	}
+	
+	//主要用于PUBLISH(发布态)的消息,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它。如果不设那么推送至当前订阅的就释放了
+	if(will_retain)
+	{
+		flags |= (MQTT_CONNECT_WILL_FLAG | MQTT_CONNECT_WILL_RETAIN);
+	}
+	
+	//账号为空 密码为空---------------------------------------------------------------------
+	if(!user || !password)
+	{
+		return 3;
+	}
+	flags |= MQTT_CONNECT_USER_NAME | MQTT_CONNECT_PASSORD;
+	
+	total_len += strlen(user) + strlen(password) + 4;
+	
+	//分配内存-----------------------------------------------------------------------------
+	MQTT_NewBuffer(mqttPacket, total_len);
+	if(mqttPacket->_data == NULL)
+		return 4;
+	
+	memset(mqttPacket->_data, 0, total_len);
+	
+/*************************************固定头部***********************************************/
+	
+	//固定头部----------------------连接请求类型---------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_CONNECT << 4;
+	
+	//固定头部----------------------剩余长度值-----------------------------------------------
+	len = MQTT_DumpLength(total_len - 5, mqttPacket->_data + mqttPacket->_len);
+	if(len < 0)
+	{
+		MQTT_DeleteBuffer(mqttPacket);
+		return 5;
+	}
+	else
+		mqttPacket->_len += len;
+	
+/*************************************可变头部***********************************************/
+	
+	//可变头部----------------------协议名长度 和 协议名--------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = 0;
+	mqttPacket->_data[mqttPacket->_len++] = 4;
+	mqttPacket->_data[mqttPacket->_len++] = 'M';
+	mqttPacket->_data[mqttPacket->_len++] = 'Q';
+	mqttPacket->_data[mqttPacket->_len++] = 'T';
+	mqttPacket->_data[mqttPacket->_len++] = 'T';
+	
+	//可变头部----------------------protocol level 4-----------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = 4;
+	
+	//可变头部----------------------连接标志(该函数开头处理的数据)-----------------------------
+    mqttPacket->_data[mqttPacket->_len++] = flags;
+	
+	//可变头部----------------------保持连接的时间(秒)----------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(cTime);
+	mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(cTime);
+	 
+/*************************************消息体************************************************/
+
+	//消息体----------------------------devid长度、devid-------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(devid_len);
+	mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(devid_len);
+	
+	strncat((int8 *)mqttPacket->_data + mqttPacket->_len, devid, devid_len);
+	mqttPacket->_len += devid_len;
+	
+	//消息体----------------------------will_flag 和 will_msg---------------------------------
+	if(flags & MQTT_CONNECT_WILL_FLAG)
+	{
+		unsigned short mLen = 0;
+		
+		if(!will_msg)
+			will_msg = "";
+		
+		mLen = strlen(will_topic);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(mLen);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(mLen);
+		strncat((int8 *)mqttPacket->_data + mqttPacket->_len, will_topic, mLen);
+		mqttPacket->_len += mLen;
+		
+		mLen = strlen(will_msg);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(mLen);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(mLen);
+		strncat((int8 *)mqttPacket->_data + mqttPacket->_len, will_msg, mLen);
+		mqttPacket->_len += mLen;
+	}
+	
+	//消息体----------------------------use---------------------------------------------------
+	if(flags & MQTT_CONNECT_USER_NAME)
+	{
+		unsigned short user_len = strlen(user);
+		
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(user_len);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(user_len);
+		strncat((int8 *)mqttPacket->_data + mqttPacket->_len, user, user_len);
+		mqttPacket->_len += user_len;
+	}
+
+	//消息体----------------------------password----------------------------------------------
+	if(flags & MQTT_CONNECT_PASSORD)
+	{
+		unsigned short psw_len = strlen(password);
+		
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(psw_len);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(psw_len);
+		strncat((int8 *)mqttPacket->_data + mqttPacket->_len, password, psw_len);
+		mqttPacket->_len += psw_len;
+	}
+
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketDisConnect
+//
+//	函数功能:	断开连接消息组包
+//
+//	入口参数:	mqttPacket:包指针
+//
+//	返回参数:	0-成功		1-失败
+//
+//	说明:		
+//==========================================================
+uint1 MQTT_PacketDisConnect(MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+
+	MQTT_NewBuffer(mqttPacket, 2);
+	if(mqttPacket->_data == NULL)
+		return 1;
+	
+/*************************************固定头部***********************************************/
+	
+	//固定头部----------------------头部消息-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_DISCONNECT << 4;
+	
+	//固定头部----------------------剩余长度值-----------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = 0;
+	
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_UnPacketConnectAck
+//
+//	函数功能:	连接消息解包
+//
+//	入口参数:	rev_data:接收的数据
+//
+//	返回参数:	1、255-失败		其他-平台的返回码
+//
+//	说明:		
+//==========================================================
+uint8 MQTT_UnPacketConnectAck(uint8 *rev_data)
+{
+
+	if(rev_data[1] != 2)
+		return 1;
+	
+	if(rev_data[2] == 0 || rev_data[2] == 1)
+		return rev_data[3];
+	else
+		return 255;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketSaveData
+//
+//	函数功能:	数据点上传组包
+//
+//	入口参数:	devid:设备ID(可为空)
+//				send_buf:json缓存buf
+//				send_len:json总长
+//				type_bin_head:bin文件的消息头
+//				type:类型
+//
+//	返回参数:	0-成功		1-失败
+//
+//	说明:		
+//==========================================================
+uint1 MQTT_PacketSaveData(const int8 *devid, int16 send_len, int8 *type_bin_head, uint8 type, MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+
+	if(MQTT_PacketPublish(MQTT_PUBLISH_ID, "$dp", NULL, send_len + 3, MQTT_QOS_LEVEL1, 0, 1, mqttPacket) == 0)
+	{
+		mqttPacket->_data[mqttPacket->_len++] = type;					//类型
+		
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(send_len);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(send_len);
+	}
+	else
+		return 1;
+	
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketSaveBinData
+//
+//	函数功能:	为禁止文件上传组包
+//
+//	入口参数:	name:数据流名字
+//				file_len:文件长度
+//				mqttPacket:包指针
+//
+//	返回参数:	0-成功		1-失败
+//
+//	说明:		
+//==========================================================
+uint1 MQTT_PacketSaveBinData(const int8 *name, int16 file_len, MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+
+	uint1 result = 1;
+	int8 *bin_head = NULL;
+	uint8 bin_head_len = 0;
+	int8 *payload = NULL;
+	int32 payload_size = 0;
+	
+	bin_head = (int8 *)MQTT_MallocBuffer(13 + strlen(name));
+	if(bin_head == NULL)
+		return result;
+	
+	sprintf(bin_head, "{\"ds_id\":\"%s\"}", name);
+	
+	bin_head_len = strlen(bin_head);
+	payload_size = 7 + bin_head_len + file_len;
+	
+	payload = (int8 *)MQTT_MallocBuffer(payload_size - file_len);
+	if(payload == NULL)
+	{
+		MQTT_FreeBuffer(bin_head);
+		
+		return result;
+	}
+	
+	payload[0] = 2;						//类型
+		
+	payload[1] = MOSQ_MSB(bin_head_len);
+	payload[2] = MOSQ_LSB(bin_head_len);
+	
+	memcpy(payload + 3, bin_head, bin_head_len);
+	
+	payload[bin_head_len + 3] = (file_len >> 24) & 0xFF;
+	payload[bin_head_len + 4] = (file_len >> 16) & 0xFF;
+	payload[bin_head_len + 5] = (file_len >> 8) & 0xFF;
+	payload[bin_head_len + 6] = file_len & 0xFF;
+	
+	if(MQTT_PacketPublish(MQTT_PUBLISH_ID, "$dp", payload, payload_size, MQTT_QOS_LEVEL1, 0, 1, mqttPacket) == 0)
+		result = 0;
+	
+	MQTT_FreeBuffer(bin_head);
+	MQTT_FreeBuffer(payload);
+	
+	return result;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_UnPacketCmd
+//
+//	函数功能:	命令下发解包
+//
+//	入口参数:	rev_data:接收的数据指针
+//				cmdid:cmdid-uuid
+//				req:命令
+//
+//	返回参数:	0-成功		其他-失败原因
+//
+//	说明:		
+//==========================================================
+uint8 MQTT_UnPacketCmd(uint8 *rev_data, int8 **cmdid, int8 **req, uint16 *req_len)
+{
+
+	int8 *dataPtr = strchr((int8 *)rev_data + 6, '/');	//加6是跳过头信息
+	
+	uint32 remain_len = 0;
+	
+	if(dataPtr == NULL)									//未找到'/'
+		return 1;
+	dataPtr++;											//跳过'/'
+	
+	MQTT_ReadLength(rev_data + 1, 4, &remain_len);		//读取剩余字节
+	
+	*cmdid = (int8 *)MQTT_MallocBuffer(37);				//cmdid固定36字节,多分配一个结束符的位置
+	if(*cmdid == NULL)
+		return 2;
+	
+	memset(*cmdid, 0, 37);								//全部清零
+	memcpy(*cmdid, (const int8 *)dataPtr, 36);			//复制cmdid
+	dataPtr += 36;
+	
+	*req_len = remain_len - 44;							//命令长度 = 剩余长度(remain_len) - 2 - 5($creq) - 1(\) - cmdid长度
+	*req = (int8 *)MQTT_MallocBuffer(*req_len + 1);		//分配命令长度+1
+	if(*req == NULL)
+	{
+		MQTT_FreeBuffer(*cmdid);
+		return 3;
+	}
+	
+	memset(*req, 0, *req_len + 1);						//清零
+	memcpy(*req, (const int8 *)dataPtr, *req_len);		//复制命令
+	
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketCmdResp
+//
+//	函数功能:	命令回复组包
+//
+//	入口参数:	cmdid:cmdid
+//				req:命令
+//				mqttPacket:包指针
+//
+//	返回参数:	0-成功		1-失败
+//
+//	说明:		
+//==========================================================
+uint1 MQTT_PacketCmdResp(const int8 *cmdid, const int8 *req, MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+	
+	uint16 cmdid_len = strlen(cmdid);
+	uint16 req_len = strlen(req);
+	_Bool status = 0;
+	
+	int8 *payload = MQTT_MallocBuffer(cmdid_len + 6);
+	if(payload == NULL)
+		return 1;
+	
+	memset(payload, 0, cmdid_len + 6);
+	memcpy(payload, "$crsp/", 6);
+	strncat(payload, cmdid, cmdid_len);
+
+	if(MQTT_PacketPublish(MQTT_PUBLISH_ID, payload, req, strlen(req), MQTT_QOS_LEVEL0, 0, 1, mqttPacket) == 0)
+		status = 0;
+	else
+		status = 1;
+	
+	MQTT_FreeBuffer(payload);
+	
+	return status;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketSubscribe
+//
+//	函数功能:	Subscribe消息组包
+//
+//	入口参数:	pkt_id:pkt_id
+//				qos:消息重发次数
+//				topics:订阅的消息
+//				topics_cnt:订阅的消息个数
+//				mqttPacket:包指针
+//
+//	返回参数:	0-成功		其他-失败
+//
+//	说明:		
+//==========================================================
+uint8 MQTT_PacketSubscribe(uint16 pkt_id, enum MqttQosLevel qos, const int8 *topics[], uint8 topics_cnt, MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+	
+	uint32 topic_len = 0, remain_len = 0;
+	int16 len = 0;
+	uint8 i = 0;
+	
+	if(pkt_id == 0)
+		return 1;
+	
+	//计算topic长度-------------------------------------------------------------------------
+	for(; i < topics_cnt; i++)
+	{
+		if(topics[i] == NULL)
+			return 2;
+		
+		topic_len += strlen(topics[i]);
+	}
+	
+	//2 bytes packet id + topic filter(2 bytes topic + topic length + 1 byte reserve)------
+	remain_len = 2 + 3 * topics_cnt + topic_len;
+	
+	//分配内存------------------------------------------------------------------------------
+	MQTT_NewBuffer(mqttPacket, remain_len + 5);
+	if(mqttPacket->_data == NULL)
+		return 3;
+	
+/*************************************固定头部***********************************************/
+	
+	//固定头部----------------------头部消息-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_SUBSCRIBE << 4 | 0x02;
+	
+	//固定头部----------------------剩余长度值-----------------------------------------------
+	len = MQTT_DumpLength(remain_len, mqttPacket->_data + mqttPacket->_len);
+	if(len < 0)
+	{
+		MQTT_DeleteBuffer(mqttPacket);
+		return 4;
+	}
+	else
+		mqttPacket->_len += len;
+	
+/*************************************payload***********************************************/
+	
+	//payload----------------------pkt_id---------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(pkt_id);
+	mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(pkt_id);
+	
+	//payload----------------------topic_name-----------------------------------------------
+	for(i = 0; i < topics_cnt; i++)
+	{
+		topic_len = strlen(topics[i]);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(topic_len);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(topic_len);
+		
+		strncat((int8 *)mqttPacket->_data + mqttPacket->_len, topics[i], topic_len);
+		mqttPacket->_len += topic_len;
+		
+		mqttPacket->_data[mqttPacket->_len++] = qos & 0xFF;
+	}
+
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_UnPacketSubscrebe
+//
+//	函数功能:	Subscribe的回复消息解包
+//
+//	入口参数:	rev_data:接收到的信息
+//
+//	返回参数:	0-成功		其他-失败
+//
+//	说明:		
+//==========================================================
+uint8 MQTT_UnPacketSubscribe(uint8 *rev_data)
+{
+	
+	uint8 result = 255;
+
+	if(rev_data[2] == MOSQ_MSB(MQTT_SUBSCRIBE_ID) && rev_data[3] == MOSQ_LSB(MQTT_SUBSCRIBE_ID))
+	{
+		switch(rev_data[4])
+		{
+			case 0x00:
+			case 0x01:
+			case 0x02:
+				//MQTT Subscribe OK
+				result = 0;
+			break;
+			
+			case 0x80:
+				//MQTT Subscribe Failed
+				result = 1;
+			break;
+			
+			default:
+				//MQTT Subscribe UnKnown Err
+				result = 2;
+			break;
+		}
+	}
+	
+	return result;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketUnSubscribe
+//
+//	函数功能:	UnSubscribe消息组包
+//
+//	入口参数:	pkt_id:pkt_id
+//				qos:消息重发次数
+//				topics:订阅的消息
+//				topics_cnt:订阅的消息个数
+//				mqttPacket:包指针
+//
+//	返回参数:	0-成功		其他-失败
+//
+//	说明:		
+//==========================================================
+uint8 MQTT_PacketUnSubscribe(uint16 pkt_id, const int8 *topics[], uint8 topics_cnt, MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+	
+	uint32 topic_len = 0, remain_len = 0;
+	int16 len = 0;
+	uint8 i = 0;
+	
+	if(pkt_id == 0)
+		return 1;
+	
+	//计算topic长度-------------------------------------------------------------------------
+	for(; i < topics_cnt; i++)
+	{
+		if(topics[i] == NULL)
+			return 2;
+		
+		topic_len += strlen(topics[i]);
+	}
+	
+	//2 bytes packet id, 2 bytes topic length + topic + 1 byte reserve---------------------
+	remain_len = 2 + (topics_cnt << 1) + topic_len;
+	
+	//分配内存------------------------------------------------------------------------------
+	MQTT_NewBuffer(mqttPacket, remain_len + 5);
+	if(mqttPacket->_data == NULL)
+		return 3;
+	
+/*************************************固定头部***********************************************/
+	
+	//固定头部----------------------头部消息-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_UNSUBSCRIBE << 4 | 0x02;
+	
+	//固定头部----------------------剩余长度值-----------------------------------------------
+	len = MQTT_DumpLength(remain_len, mqttPacket->_data + mqttPacket->_len);
+	if(len < 0)
+	{
+		MQTT_DeleteBuffer(mqttPacket);
+		return 4;
+	}
+	else
+		mqttPacket->_len += len;
+	
+/*************************************payload***********************************************/
+	
+	//payload----------------------pkt_id---------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(pkt_id);
+	mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(pkt_id);
+	
+	//payload----------------------topic_name-----------------------------------------------
+	for(i = 0; i < topics_cnt; i++)
+	{
+		topic_len = strlen(topics[i]);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(topic_len);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(topic_len);
+		
+		strncat((int8 *)mqttPacket->_data + mqttPacket->_len, topics[i], topic_len);
+		mqttPacket->_len += topic_len;
+	}
+
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_UnPacketUnSubscribe
+//
+//	函数功能:	UnSubscribe的回复消息解包
+//
+//	入口参数:	rev_data:接收到的信息
+//
+//	返回参数:	0-成功		其他-失败
+//
+//	说明:		
+//==========================================================
+uint1 MQTT_UnPacketUnSubscribe(uint8 *rev_data)
+{
+	
+	uint1 result = 1;
+
+	if(rev_data[2] == MOSQ_MSB(MQTT_UNSUBSCRIBE_ID) && rev_data[3] == MOSQ_LSB(MQTT_UNSUBSCRIBE_ID))
+	{
+		result = 0;
+	}
+	
+	return result;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketPublish
+//
+//	函数功能:	Pulish消息组包
+//
+//	入口参数:	pkt_id:pkt_id
+//				topic:发布的topic
+//				payload:消息体
+//				payload_len:消息体长度
+//				qos:重发次数
+//				retain:离线消息推送
+//				own:
+//				mqttPacket:包指针
+//
+//	返回参数:	0-成功		其他-失败
+//
+//	说明:		
+//==========================================================
+uint8 MQTT_PacketPublish(uint16 pkt_id, const int8 *topic,
+						const int8 *payload, uint32 payload_len,
+						enum MqttQosLevel qos, int32 retain, int32 own,
+						MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+
+	uint32 total_len = 0, topic_len = 0;
+	uint32 data_len = 0;
+	int32 len = 0;
+	uint8 flags = 0;
+	
+	//pkt_id检查----------------------------------------------------------------------------
+	if(pkt_id == 0)
+		return 1;
+	
+	//$dp为系统上传数据点的指令--------------------------------------------------------------
+	for(topic_len = 0; topic[topic_len] != '\0'; ++topic_len)
+	{
+		if((topic[topic_len] == '#') || (topic[topic_len] == '+'))
+			return 2;
+	}
+	
+	//Publish消息---------------------------------------------------------------------------
+	flags |= MQTT_PKT_PUBLISH << 4;
+	
+	//retain标志----------------------------------------------------------------------------
+	if(retain)
+		flags |= 0x01;
+	
+	//总长度--------------------------------------------------------------------------------
+	total_len = topic_len + payload_len + 2;
+	
+	//qos级别--主要用于PUBLISH(发布态)消息的,保证消息传递的次数-----------------------------
+	switch(qos)
+	{
+		case MQTT_QOS_LEVEL0:
+			flags |= MQTT_CONNECT_WILL_QOS0;	//最多一次
+		break;
+		
+		case MQTT_QOS_LEVEL1:
+			flags |= 0x02;						//最少一次
+			total_len += 2;
+		break;
+		
+		case MQTT_QOS_LEVEL2:
+			flags |= 0x04;						//只有一次
+			total_len += 2;
+		break;
+		
+		default:
+		return 3;
+	}
+	
+	//分配内存------------------------------------------------------------------------------
+	if(payload[0] == 2)
+	{
+		uint32 data_len_t = 0;
+		
+		while(payload[data_len_t++] != '}');
+		data_len_t -= 3;
+		data_len = data_len_t + 7;
+		data_len_t = payload_len - data_len;
+		
+		MQTT_NewBuffer(mqttPacket, total_len + 3 - data_len_t);
+		
+		if(mqttPacket->_data == NULL)
+			return 4;
+		
+		memset(mqttPacket->_data, 0, total_len + 3 - data_len_t);
+	}
+	else
+	{
+		MQTT_NewBuffer(mqttPacket, total_len + 3);
+		
+		if(mqttPacket->_data == NULL)
+			return 4;
+		
+		memset(mqttPacket->_data, 0, total_len + 3);
+	}
+	
+/*************************************固定头部***********************************************/
+	
+	//固定头部----------------------头部消息-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = flags;
+	
+	//固定头部----------------------剩余长度值-----------------------------------------------
+	len = MQTT_DumpLength(total_len, mqttPacket->_data + mqttPacket->_len);
+	if(len < 0)
+	{
+		MQTT_DeleteBuffer(mqttPacket);
+		return 5;
+	}
+	else
+		mqttPacket->_len += len;
+	
+/*************************************可变头部***********************************************/
+	
+	//可变头部----------------------写入topic长度、topic-------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(topic_len);
+	mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(topic_len);
+	
+	strncat((int8 *)mqttPacket->_data + mqttPacket->_len, topic, topic_len);
+	mqttPacket->_len += topic_len;
+	if(qos != MQTT_QOS_LEVEL0)
+	{
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(pkt_id);
+		mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(pkt_id);
+	}
+	
+	//可变头部----------------------写入payload----------------------------------------------
+	if(payload != NULL)
+	{
+		if(payload[0] == 2)
+		{
+			memcpy((int8 *)mqttPacket->_data + mqttPacket->_len, payload, data_len);
+			mqttPacket->_len += data_len;
+		}
+		else
+		{
+			memcpy((int8 *)mqttPacket->_data + mqttPacket->_len, payload, payload_len);
+			mqttPacket->_len += payload_len;
+		}
+	}
+	
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_UnPacketPublish
+//
+//	函数功能:	Publish消息解包
+//
+//	入口参数:	flags:MQTT相关标志信息
+//				pkt:指向可变头部
+//				size:固定头部中的剩余长度信息
+//
+//	返回参数:	0-成功		其他-失败原因
+//
+//	说明:		
+//==========================================================
+uint8 MQTT_UnPacketPublish(uint8 *rev_data, int8 **topic, uint16 *topic_len, int8 **payload, uint16 *payload_len, uint8 *qos, uint16 *pkt_id)
+{
+	
+	const int8 flags = rev_data[0] & 0x0F;
+	uint8 *msgPtr;
+	uint32 remain_len = 0;
+
+	const int8 dup = flags & 0x08;
+
+	*qos = (flags & 0x06) >> 1;
+	
+	msgPtr = rev_data + MQTT_ReadLength(rev_data + 1, 4, &remain_len) + 1;
+	
+	if(remain_len < 2 || flags & 0x01)							//retain
+		return 255;
+	
+	*topic_len = (uint16)msgPtr[0] << 8 | msgPtr[1];
+	if(remain_len < *topic_len + 2)
+		return 255;
+	
+	if(strstr((int8 *)msgPtr + 2, CMD_TOPIC_PREFIX) != NULL)	//如果是命令下发
+		return MQTT_PKT_CMD;
+	
+	switch(*qos)
+	{
+		case MQTT_QOS_LEVEL0:									// qos0 have no packet identifier
+			
+			if(0 != dup)
+				return 255;
+
+			*topic = MQTT_MallocBuffer(*topic_len + 1);			//为topic分配内存
+			if(*topic == NULL)
+				return 255;
+			
+			memset(*topic, 0, *topic_len + 1);
+			memcpy(*topic, (int8 *)msgPtr + 2, *topic_len);		//复制数据
+			
+			*payload_len = remain_len - 2 - *topic_len;			//为payload分配内存
+			*payload = MQTT_MallocBuffer(*payload_len + 1);
+			if(*payload == NULL)								//如果失败
+			{
+				MQTT_FreeBuffer(*topic);						//则需要把topic的内存释放掉
+				return 255;
+			}
+			
+			memset(*payload, 0, *payload_len + 1);
+			memcpy(*payload, (int8 *)msgPtr + 2 + *topic_len, *payload_len);
+			
+		break;
+
+		case MQTT_QOS_LEVEL1:
+		case MQTT_QOS_LEVEL2:
+			
+			if(*topic_len + 2 > remain_len)
+				return 255;
+			
+			*pkt_id = (uint16)msgPtr[*topic_len + 2] << 8 | msgPtr[*topic_len + 3];
+			if(pkt_id == 0)
+				return 255;
+			
+			*topic = MQTT_MallocBuffer(*topic_len + 1);			//为topic分配内存
+			if(*topic == NULL)
+				return 255;
+			
+			memset(*topic, 0, *topic_len + 1);
+			memcpy(*topic, (int8 *)msgPtr + 2, *topic_len);		//复制数据
+			
+			*payload_len = remain_len - 4 - *topic_len;
+			*payload = MQTT_MallocBuffer(*payload_len + 1);		//为payload分配内存
+			if(*payload == NULL)								//如果失败
+			{
+				MQTT_FreeBuffer(*topic);						//则需要把topic的内存释放掉
+				return 255;
+			}
+			
+			memset(*payload, 0, *payload_len + 1);
+			memcpy(*payload, (int8 *)msgPtr + 4 + *topic_len, *payload_len);
+			
+		break;
+
+		default:
+			return 255;
+	}
+	
+	if(strchr((int8 *)topic, '+') || strchr((int8 *)topic, '#'))
+		return 255;
+
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketPublishAck
+//
+//	函数功能:	Publish Ack消息组包
+//
+//	入口参数:	pkt_id:packet id
+//				mqttPacket:包指针
+//
+//	返回参数:	0-成功		1-失败原因
+//
+//	说明:		当收到的Publish消息的QoS等级为1时,需要Ack回复
+//==========================================================
+uint1 MQTT_PacketPublishAck(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+
+	MQTT_NewBuffer(mqttPacket, 4);
+	if(mqttPacket->_data == NULL)
+		return 1;
+	
+/*************************************固定头部***********************************************/
+	
+	//固定头部----------------------头部消息-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBACK << 4;
+	
+	//固定头部----------------------剩余长度-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = 2;
+	
+/*************************************可变头部***********************************************/
+	
+	//可变头部----------------------pkt_id长度-----------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
+	mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
+	
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_UnPacketPublishAck
+//
+//	函数功能:	Publish Ack消息解包
+//
+//	入口参数:	rev_data:收到的数据
+//
+//	返回参数:	0-成功		1-失败原因
+//
+//	说明:		
+//==========================================================
+uint1 MQTT_UnPacketPublishAck(uint8 *rev_data)
+{
+
+	if(rev_data[1] != 2)
+		return 1;
+
+	if(rev_data[2] == MOSQ_MSB(MQTT_PUBLISH_ID) && rev_data[3] == MOSQ_LSB(MQTT_PUBLISH_ID))
+		return 0;
+	else
+		return 1;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketPublishRec
+//
+//	函数功能:	Publish Rec消息组包
+//
+//	入口参数:	pkt_id:packet id
+//				mqttPacket:包指针
+//
+//	返回参数:	0-成功		1-失败原因
+//
+//	说明:		当收到的Publish消息的QoS等级为2时,先收到rec
+//==========================================================
+uint1 MQTT_PacketPublishRec(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+
+	MQTT_NewBuffer(mqttPacket, 4);
+	if(mqttPacket->_data == NULL)
+		return 1;
+	
+/*************************************固定头部***********************************************/
+	
+	//固定头部----------------------头部消息-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBREC << 4;
+	
+	//固定头部----------------------剩余长度-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = 2;
+	
+/*************************************可变头部***********************************************/
+	
+	//可变头部----------------------pkt_id长度-----------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
+	mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
+	
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_UnPacketPublishRec
+//
+//	函数功能:	Publish Rec消息解包
+//
+//	入口参数:	rev_data:接收到的数据
+//
+//	返回参数:	0-成功		1-失败
+//
+//	说明:		
+//==========================================================
+uint1 MQTT_UnPacketPublishRec(uint8 *rev_data)
+{
+
+	if(rev_data[1] != 2)
+		return 1;
+
+	if(rev_data[2] == MOSQ_MSB(MQTT_PUBLISH_ID) && rev_data[3] == MOSQ_LSB(MQTT_PUBLISH_ID))
+		return 0;
+	else
+		return 1;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketPublishRel
+//
+//	函数功能:	Publish Rel消息组包
+//
+//	入口参数:	pkt_id:packet id
+//				mqttPacket:包指针
+//
+//	返回参数:	0-成功		1-失败原因
+//
+//	说明:		当收到的Publish消息的QoS等级为2时,先收到rec,再回复rel
+//==========================================================
+uint1 MQTT_PacketPublishRel(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+
+	MQTT_NewBuffer(mqttPacket, 4);
+	if(mqttPacket->_data == NULL)
+		return 1;
+	
+/*************************************固定头部***********************************************/
+	
+	//固定头部----------------------头部消息-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBREL << 4 | 0x02;
+	
+	//固定头部----------------------剩余长度-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = 2;
+	
+/*************************************可变头部***********************************************/
+	
+	//可变头部----------------------pkt_id长度-----------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
+	mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
+	
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_UnPacketPublishRel
+//
+//	函数功能:	Publish Rel消息解包
+//
+//	入口参数:	rev_data:接收到的数据
+//
+//	返回参数:	0-成功		1-失败
+//
+//	说明:		
+//==========================================================
+uint1 MQTT_UnPacketPublishRel(uint8 *rev_data, uint16 pkt_id)
+{
+
+	if(rev_data[1] != 2)
+		return 1;
+
+	if(rev_data[2] == MOSQ_MSB(pkt_id) && rev_data[3] == MOSQ_LSB(pkt_id))
+		return 0;
+	else
+		return 1;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketPublishComp
+//
+//	函数功能:	Publish Comp消息组包
+//
+//	入口参数:	pkt_id:packet id
+//				mqttPacket:包指针
+//
+//	返回参数:	0-成功		1-失败原因
+//
+//	说明:		当收到的Publish消息的QoS等级为2时,先收到rec,再回复rel
+//==========================================================
+uint1 MQTT_PacketPublishComp(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+
+	MQTT_NewBuffer(mqttPacket, 4);
+	if(mqttPacket->_data == NULL)
+		return 1;
+	
+/*************************************固定头部***********************************************/
+	
+	//固定头部----------------------头部消息-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBCOMP << 4;
+	
+	//固定头部----------------------剩余长度-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = 2;
+	
+/*************************************可变头部***********************************************/
+	
+	//可变头部----------------------pkt_id长度-----------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
+	mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
+	
+	return 0;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_UnPacketPublishComp
+//
+//	函数功能:	Publish Comp消息解包
+//
+//	入口参数:	rev_data:接收到的数据
+//
+//	返回参数:	0-成功		1-失败
+//
+//	说明:		
+//==========================================================
+uint1 MQTT_UnPacketPublishComp(uint8 *rev_data)
+{
+
+	if(rev_data[1] != 2)
+		return 1;
+
+	if(rev_data[2] == MOSQ_MSB(MQTT_PUBLISH_ID) && rev_data[3] == MOSQ_LSB(MQTT_PUBLISH_ID))
+		return 0;
+	else
+		return 1;
+
+}
+
+//==========================================================
+//	函数名称:	MQTT_PacketPing
+//
+//	函数功能:	心跳请求组包
+//
+//	入口参数:	mqttPacket:包指针
+//
+//	返回参数:	0-成功		1-失败
+//
+//	说明:		
+//==========================================================
+uint1 MQTT_PacketPing(MQTT_PACKET_STRUCTURE *mqttPacket)
+{
+
+	MQTT_NewBuffer(mqttPacket, 2);
+	if(mqttPacket->_data == NULL)
+		return 1;
+	
+/*************************************固定头部***********************************************/
+	
+	//固定头部----------------------头部消息-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PINGREQ << 4;
+	
+	//固定头部----------------------剩余长度-------------------------------------------------
+	mqttPacket->_data[mqttPacket->_len++] = 0;
+	
+	return 0;
+
+}

+ 183 - 0
module_Template/OneNET/MqttKit.h

@@ -0,0 +1,183 @@
+#ifndef _MQTTKIT_H_
+#define _MQTTKIT_H_
+
+#include "main.h"
+//#include "Common.h"
+
+
+//=============================配置==============================
+//===========可以提供RTOS的内存管理方案,也可以使用C库的=========
+//RTOS
+//#include <stdlib.h>
+
+#define MQTT_MallocBuffer	malloc
+
+#define MQTT_FreeBuffer		free
+//==========================================================
+
+
+#define MOSQ_MSB(A)         (uint8)((A & 0xFF00) >> 8)
+#define MOSQ_LSB(A)         (uint8)(A & 0x00FF)
+
+
+/*--------------------------------内存分配方案标志--------------------------------*/
+#define MEM_FLAG_NULL		0
+#define MEM_FLAG_ALLOC		1
+#define MEM_FLAG_STATIC		2
+
+
+typedef struct Buffer
+{
+	
+	uint8	*_data;		//协议数据
+	
+	uint32	_len;		//写入的数据长度
+	
+	uint32	_size;		//缓存总大小
+	
+	uint8	_memFlag;	//内存使用的方案:0-未分配	1-使用的动态分配		2-使用的固定内存
+	
+} MQTT_PACKET_STRUCTURE;
+
+
+/*--------------------------------固定头部消息类型--------------------------------*/
+enum MqttPacketType
+{
+	
+    MQTT_PKT_CONNECT = 1, /**< 连接请求数据包 */
+    MQTT_PKT_CONNACK,     /**< 连接确认数据包 */
+    MQTT_PKT_PUBLISH,     /**< 发布数据数据包 */
+    MQTT_PKT_PUBACK,      /**< 发布确认数据包 */
+    MQTT_PKT_PUBREC,      /**< 发布数据已接收数据包,Qos 2时,回复MQTT_PKT_PUBLISH */
+    MQTT_PKT_PUBREL,      /**< 发布数据释放数据包, Qos 2时,回复MQTT_PKT_PUBREC */
+    MQTT_PKT_PUBCOMP,     /**< 发布完成数据包, Qos 2时,回复MQTT_PKT_PUBREL */
+    MQTT_PKT_SUBSCRIBE,   /**< 订阅数据包 */
+    MQTT_PKT_SUBACK,      /**< 订阅确认数据包 */
+    MQTT_PKT_UNSUBSCRIBE, /**< 取消订阅数据包 */
+    MQTT_PKT_UNSUBACK,    /**< 取消订阅确认数据包 */
+    MQTT_PKT_PINGREQ,     /**< ping 数据包 */
+    MQTT_PKT_PINGRESP,    /**< ping 响应数据包 */
+    MQTT_PKT_DISCONNECT,  /**< 断开连接数据包 */
+	
+	//新增
+	
+	MQTT_PKT_CMD  		 /**< 命令下发数据包 */
+	
+};
+
+
+/*--------------------------------MQTT QOS等级--------------------------------*/
+enum MqttQosLevel
+{
+	
+    MQTT_QOS_LEVEL0,  /**< 最多发送一次 */
+    MQTT_QOS_LEVEL1,  /**< 最少发送一次  */
+    MQTT_QOS_LEVEL2   /**< 只发送一次 */
+	
+};
+
+
+/*--------------------------------MQTT 连接请求标志位,内部使用--------------------------------*/
+enum MqttConnectFlag
+{
+	
+    MQTT_CONNECT_CLEAN_SESSION  = 0x02,
+    MQTT_CONNECT_WILL_FLAG      = 0x04,
+    MQTT_CONNECT_WILL_QOS0      = 0x00,
+    MQTT_CONNECT_WILL_QOS1      = 0x08,
+    MQTT_CONNECT_WILL_QOS2      = 0x10,
+    MQTT_CONNECT_WILL_RETAIN    = 0x20,
+    MQTT_CONNECT_PASSORD        = 0x40,
+    MQTT_CONNECT_USER_NAME      = 0x80
+	
+};
+
+
+/*--------------------------------消息的packet ID,可自定义--------------------------------*/
+#define MQTT_PUBLISH_ID			10
+
+#define MQTT_SUBSCRIBE_ID		20
+
+#define MQTT_UNSUBSCRIBE_ID		30
+
+
+/*--------------------------------删包--------------------------------*/
+void MQTT_DeleteBuffer(MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------解包--------------------------------*/
+uint8 MQTT_UnPacketRecv(uint8 *dataPtr);
+
+/*--------------------------------登录组包--------------------------------*/
+uint8 MQTT_PacketConnect(const int8 *user, const int8 *password, const int8 *devid,
+						uint16 cTime, uint1 clean_session, uint1 qos,
+						const int8 *will_topic, const int8 *will_msg, int32 will_retain,
+						MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------断开连接组包--------------------------------*/
+uint1 MQTT_PacketDisConnect(MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------连接响应解包--------------------------------*/
+uint8 MQTT_UnPacketConnectAck(uint8 *rev_data);
+
+/*--------------------------------数据点上传组包--------------------------------*/
+uint1 MQTT_PacketSaveData(const int8 *devid, int16 send_len, int8 *type_bin_head, uint8 type, MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------二进制文件上传组包--------------------------------*/
+uint1 MQTT_PacketSaveBinData(const int8 *name, int16 file_len, MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------命令下发解包--------------------------------*/
+uint8 MQTT_UnPacketCmd(uint8 *rev_data, int8 **cmdid, int8 **req, uint16 *req_len);
+
+/*--------------------------------命令回复组包--------------------------------*/
+uint1 MQTT_PacketCmdResp(const int8 *cmdid, const int8 *req, MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------订阅主题组包--------------------------------*/
+uint8 MQTT_PacketSubscribe(uint16 pkt_id, enum MqttQosLevel qos, const int8 *topics[], uint8 topics_cnt, MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------订阅主题回复解包--------------------------------*/
+uint8 MQTT_UnPacketSubscribe(uint8 *rev_data);
+
+/*--------------------------------取消订阅组包--------------------------------*/
+uint8 MQTT_PacketUnSubscribe(uint16 pkt_id, const int8 *topics[], uint8 topics_cnt, MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------取消订阅回复解包--------------------------------*/
+uint1 MQTT_UnPacketUnSubscribe(uint8 *rev_data);
+
+/*--------------------------------发布主题组包--------------------------------*/
+uint8 MQTT_PacketPublish(uint16 pkt_id, const int8 *topic,
+						const int8 *payload, uint32 payload_len,
+						enum MqttQosLevel qos, int32 retain, int32 own,
+						MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------发布消息回复解包--------------------------------*/
+uint8 MQTT_UnPacketPublish(uint8 *rev_data, int8 **topic, uint16 *topic_len, int8 **payload, uint16 *payload_len, uint8 *qos, uint16 *pkt_id);
+
+/*--------------------------------发布消息的Ack组包--------------------------------*/
+uint1 MQTT_PacketPublishAck(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------发布消息的Ack解包--------------------------------*/
+uint1 MQTT_UnPacketPublishAck(uint8 *rev_data);
+
+/*--------------------------------发布消息的Rec组包--------------------------------*/
+uint1 MQTT_PacketPublishRec(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------发布消息的Rec解包--------------------------------*/
+uint1 MQTT_UnPacketPublishRec(uint8 *rev_data);
+
+/*--------------------------------发布消息的Rel组包--------------------------------*/
+uint1 MQTT_PacketPublishRel(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------发布消息的Rel解包--------------------------------*/
+uint1 MQTT_UnPacketPublishRel(uint8 *rev_data, uint16 pkt_id);
+
+/*--------------------------------发布消息的Comp组包--------------------------------*/
+uint1 MQTT_PacketPublishComp(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket);
+
+/*--------------------------------发布消息的Comp解包--------------------------------*/
+uint1 MQTT_UnPacketPublishComp(uint8 *rev_data);
+
+/*--------------------------------心跳请求组包--------------------------------*/
+uint1 MQTT_PacketPing(MQTT_PACKET_STRUCTURE *mqttPacket);
+
+
+#endif

+ 26 - 0
module_Template/OneNET/README.txt

@@ -0,0 +1,26 @@
+ESP8266连接OneNET云平台
+
+需要配合system_Template中部分组件使用,如USART,DELAY等
+
+/**********************Init 举例************************/
+USARTClass.USART2_Init(115200); // ESP8266串口初始化
+ESP8266_Init(); // 联网配置初始化
+while(OneNet_DevLink()) DELAYClass.DelayMs(500); // 接入OneNET
+
+/***********************发送举例************************/
+// 5s周期向OneNET发送
+if(AllFlag.OneNET_send_flag)
+{
+	OneNet_SendData(); // 发送数据
+	ESP8266_Clear();
+	AllFlag.OneNET_send_flag = 0;
+}
+
+/***********************读取举例************************/
+// 10ms周期从OneNET读取
+if(AllFlag.OneNET_rec_flag)
+{
+	dataPtr = ESP8266_GetIPD(0);
+	if(dataPtr != NULL)	OneNet_RevPro(dataPtr);
+	AllFlag.OneNET_rec_flag = 0;
+}

+ 271 - 0
module_Template/OneNET/onenet.c

@@ -0,0 +1,271 @@
+#include "main.h"
+//#include "stm32f10x.h"
+//#include "esp8266.h"
+//#include "onenet.h"
+//#include "mqttkit.h"
+//#include "usart.h"
+//#include "delay.h"
+//#include <string.h>
+//#include <stdio.h>
+
+
+#define PROID			"509223"			// 产品ID
+#define AUTH_INFO	"0123456789"	// 鉴权信息
+#define DEVID			"932442653"		// 设备ID
+
+/**
+  * @brief  与onenet创建连接
+  * @param  None
+  * @retval 1-成功	0-失败
+	* @note   与onenet平台建立连接
+  */
+_Bool OneNet_DevLink(void)
+{
+	MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; // 协议包
+	unsigned char *dataPtr;
+	_Bool status = 1;
+#ifdef DEBUG_printf
+	printf("OneNet_DevLink\n""PROID: %s,	AUIF: %s,	DEVID:%s\n", PROID, AUTH_INFO, DEVID);
+#endif
+	if(MQTT_PacketConnect(PROID, AUTH_INFO, DEVID, 256, 0, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0)
+	{
+		ESP8266_SendData(mqttPacket._data, mqttPacket._len);	// 上传平台
+		dataPtr = ESP8266_GetIPD(250); // 等待平台响应
+		if(dataPtr != NULL)
+		{
+			if(MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK)
+			{
+				switch(MQTT_UnPacketConnectAck(dataPtr))
+				{
+					case 0:
+						status = 0;
+#ifdef DEBUG_printf
+						printf("Tips:	连接成功\n");
+#endif
+					break;
+					case 1:
+#ifdef DEBUG_printf
+						printf("WARN:	连接失败:协议错误\n");
+#endif
+					break;
+					case 2:
+#ifdef DEBUG_printf
+						printf("WARN:	连接失败:非法的clientid\n");
+#endif
+					break;
+					case 3:
+#ifdef DEBUG_printf
+						printf("WARN:	连接失败:服务器失败\n");
+#endif
+					break;
+					case 4:
+#ifdef DEBUG_printf
+						printf("WARN:	连接失败:用户名或密码错误\n");
+#endif
+					break;
+					case 5:
+#ifdef DEBUG_printf
+						printf("WARN:	连接失败:非法链接(比如token非法)\n");
+#endif
+					break;
+					default:
+#ifdef DEBUG_printf
+						printf("ERR:	连接失败:未知错误\n");
+#endif
+					break;
+				}
+			}
+		}
+		MQTT_DeleteBuffer(&mqttPacket); // 删包
+	}
+	else
+	{
+#ifdef DEBUG_printf
+		printf("WARN:	MQTT_PacketConnect Failed\n");
+#endif
+	}
+	return status;
+}
+/**
+  * @brief  填充上传数据
+  * @param  buf:数据
+  * @retval 数据长度
+	* @note   键值对格式逗号分隔 例如 {key1:99,key2:0}
+  */
+unsigned char OneNet_FillBuf(char *buf)
+{
+	char text[128];
+	memset(text, 0, sizeof(text));
+	
+	strcpy(buf, "{");
+	/****************user handle********************/
+	memset(text, 0, sizeof(text));
+	sprintf(text, "\"temp\":%d,", AllFlag.waterTemp);
+	strcat(buf, text);
+   
+	memset(text, 0, sizeof(text));
+	sprintf(text, "\"RELAY1\":%d,",AllFlag.relay1_sta);
+	strcat(buf, text);
+
+	memset(text, 0, sizeof(text));
+	sprintf(text, "\"RELAY2\":%d,",AllFlag.relay2_sta);
+	strcat(buf, text);
+	
+	memset(text, 0, sizeof(text));
+	sprintf(text, "\"tempMax\":%d,",AllFlag.waterTempMax);
+	strcat(buf, text);
+	
+	memset(text, 0, sizeof(text));
+	sprintf(text, "\"tempMin\":%d",AllFlag.waterTempMin);
+	strcat(buf, text);
+	/**********************************************/
+	strcat(buf, "}");
+	
+	return strlen(buf);
+}
+/**
+  * @brief  上传数据到OneNET平台
+  * @param  None
+  * @retval None
+  */
+void OneNet_SendData(void)
+{
+	MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};	// 协议包
+	char buf[128];
+	short body_len = 0, i = 0;
+#ifdef DEBUG_printf
+	printf("Tips:	OneNet_SendData-MQTT\r\n");
+#endif
+	memset(buf, 0, sizeof(buf));
+	body_len = OneNet_FillBuf(buf); // 获取当前需要发送的数据流的总长度
+	if(body_len)
+	{
+		if(MQTT_PacketSaveData(DEVID, body_len, NULL, 3, &mqttPacket) == 0) // 封包
+		{
+			for(; i < body_len; i++) mqttPacket._data[mqttPacket._len++] = buf[i];
+			ESP8266_SendData(mqttPacket._data, mqttPacket._len); // 上传数据到平台
+#ifdef DEBUG_printf
+			printf("Send %d Bytes\r\n", mqttPacket._len);
+#endif
+			MQTT_DeleteBuffer(&mqttPacket); // 删包
+		}
+		else
+		{
+#ifdef DEBUG_printf
+			printf("WARN:	EDP_NewBuffer Failed\r\n");
+#endif
+		}
+	}
+}
+/**
+  * @brief  平台返回数据检测
+  * @param  cmd:平台返回的数据
+  * @retval None
+  */
+void OneNet_RevPro(unsigned char *cmd)
+{
+	MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; // 协议包
+	char *req_payload = NULL;
+	char *cmdid_topic = NULL;
+	unsigned short req_len = 0;
+	unsigned char type = 0;
+	short result = 0;
+	char *dataPtr = NULL;
+	char numBuf[10];
+	int num = 0;
+	type = MQTT_UnPacketRecv(cmd);
+	switch(type)
+	{
+		case MQTT_PKT_CMD: // 命令下发
+			result = MQTT_UnPacketCmd(cmd, &cmdid_topic, &req_payload, &req_len);	// 解出topic和消息体
+			if(result == 0)
+			{
+#ifdef DEBUG_printf
+				printf("cmdid: %s, req: %s, req_len: %d\r\n", cmdid_topic, req_payload, req_len);
+#endif
+				if(MQTT_PacketCmdResp(cmdid_topic, req_payload, &mqttPacket) == 0) // 命令回复组包
+				{
+#ifdef DEBUG_printf
+					printf("Tips:	Send CmdResp\r\n");
+#endif
+					ESP8266_SendData(mqttPacket._data, mqttPacket._len); // 回复命令
+					MQTT_DeleteBuffer(&mqttPacket); // 删包
+				}
+			}
+			break;
+		case MQTT_PKT_PUBACK: //发送Publish消息,平台回复的Ack
+			if(MQTT_UnPacketPublishAck(cmd) == 0)
+			{
+#ifdef DEBUG_printf
+				printf("Tips:	MQTT Publish Send OK\r\n");
+#endif
+			}
+			break;
+		default:
+			result = -1;
+		break;
+	}
+	ESP8266_Clear(); // 清空缓存
+	if(result == -1) return ;
+	/************************user handle*****************************/
+	if(strstr((char *)req_payload, "OPEN1")) // 搜索"OPEN1"
+	{
+#ifdef DEBUG_printf
+		printf("OPEN1\n");
+#endif
+		AllFlag.AutoCtrl_time = 0;
+		AllFlag.AutoCtrl_flag = 1;
+		GPIOClass.Set(RELAY1);
+		// user handle
+	}
+	if(strstr((char *)req_payload, "CLOSE1")) // 搜索"CLOSE1"
+	{
+		AllFlag.AutoCtrl_time = 0;
+		AllFlag.AutoCtrl_flag = 1;
+		GPIOClass.Reset(RELAY1);
+		// user handle
+	}
+	if(strstr((char *)req_payload, "OPEN2")) // 搜索"OPEN2"
+	{
+		AllFlag.AutoCtrl_time = 0;
+		AllFlag.AutoCtrl_flag = 1;
+		GPIOClass.Set(RELAY2);
+		// user handle
+	}
+	if(strstr((char *)req_payload, "CLOSE2")) // 搜索"CLOSE2"
+	{
+		AllFlag.AutoCtrl_time = 0;
+		AllFlag.AutoCtrl_flag = 1;
+		GPIOClass.Reset(RELAY2);
+		// user handle
+	}
+	
+	dataPtr = strchr(req_payload, ':'); // 搜索':'
+    
+	if(dataPtr != NULL && result != -1) // 如果找到了
+	{
+		dataPtr++;
+		while(*dataPtr >= '0' && *dataPtr <= '9')	// 判断是否是下发的命令控制数据
+		{
+			numBuf[num++] = *dataPtr++;
+		}
+		numBuf[num] = 0;
+		
+		num = atoi((const char *)numBuf); // 转为数值形式
+    /*******************************************************/
+    if(strstr((char *)req_payload, "xxx")) // 搜索"xxx"
+		{
+			AllFlag.xxx=num;
+#ifdef DEBUG_printf
+			printf("xxx:%d\n",num);
+#endif
+		}
+		AllFlag.OneNET_send_flag = 1; // 发送标志置位,立即发送
+      
+  }
+	if(type == MQTT_PKT_CMD || type == MQTT_PKT_PUBLISH)
+	{
+		MQTT_FreeBuffer(cmdid_topic);
+		MQTT_FreeBuffer(req_payload);
+	}
+}

+ 11 - 0
module_Template/OneNET/onenet.h

@@ -0,0 +1,11 @@
+#ifndef _ONENET_H_
+#define _ONENET_H_
+
+#include "main.h"
+
+
+_Bool OneNet_DevLink(void);
+void OneNet_SendData(void);
+void OneNet_RevPro(unsigned char *cmd);
+
+#endif

+ 0 - 4
module_Template/SIM900A/README.txt

@@ -1,9 +1,5 @@
-<<<<<<< HEAD
-SIM900A短信模块 仅实现发短信  移动卡效果较好
-=======
 SIM900A短信模块 实现收发短信  移动卡效果较好
 
 判断串口接收,接受到了之后查找是否有["SM",]。有则代表接收到短信,且该,后面含有存短信的地址号x。
 之后分离出地址号x,用[AT+CMGR=x]读取,读取之后查找短信头[send](自己定义的短信头)分离出短信内容(send:1)。
 然后删除该短信[AT+CMGD=x]。
->>>>>>> updata

+ 2 - 1
module_Template/WIFIGetAPI/README.txt

@@ -1 +1,2 @@
-ESP8266获取网络API的cJson数据
+ESP8266获取网络API的cJson数据
+需要配合system_Template中部分组件使用,如DELAY等

+ 5 - 0
module_Template/联网方法.txt

@@ -0,0 +1,5 @@
+联网方法:
+开启手机热点,必须是2.4G频段,5G频段连不上!!!
+热点名字改为MNIAS
+密码改为0123456789
+如果两分钟内手机显示未连接,则重启MCU

Plik diff jest za duży
+ 146 - 146
project_Template/Project/myProject.uvguix.AS


+ 2 - 136
project_Template/Project/myProject.uvoptx

@@ -10,11 +10,7 @@
     <aExt>*.s*; *.src; *.a*</aExt>
     <oExt>*.obj; *.o</oExt>
     <lExt>*.lib</lExt>
-<<<<<<< HEAD
-    <tExt>*.txt; *.h; *.inc</tExt>
-=======
     <tExt>*.txt; *.h; *.inc; *.md</tExt>
->>>>>>> updata
     <pExt>*.plm</pExt>
     <CppX>*.cpp</CppX>
     <nMigrate>0</nMigrate>
@@ -202,11 +198,7 @@
 
   <Group>
     <GroupName>core</GroupName>
-<<<<<<< HEAD
     <tvExp>0</tvExp>
-=======
-    <tvExp>1</tvExp>
->>>>>>> updata
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -234,8 +226,6 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
-<<<<<<< HEAD
-=======
     <File>
       <GroupNumber>2</GroupNumber>
       <FileNumber>4</FileNumber>
@@ -248,22 +238,17 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
->>>>>>> updata
   </Group>
 
   <Group>
     <GroupName>libraries</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>4</FileNumber>
-=======
       <FileNumber>5</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -275,11 +260,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>5</FileNumber>
-=======
       <FileNumber>6</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -291,11 +272,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>6</FileNumber>
-=======
       <FileNumber>7</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -307,11 +284,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>7</FileNumber>
-=======
       <FileNumber>8</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -323,11 +296,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>8</FileNumber>
-=======
       <FileNumber>9</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -339,11 +308,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>9</FileNumber>
-=======
       <FileNumber>10</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -355,11 +320,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>10</FileNumber>
-=======
       <FileNumber>11</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -371,11 +332,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>11</FileNumber>
-=======
       <FileNumber>12</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -387,11 +344,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>12</FileNumber>
-=======
       <FileNumber>13</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -403,11 +356,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>13</FileNumber>
-=======
       <FileNumber>14</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -419,11 +368,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>14</FileNumber>
-=======
       <FileNumber>15</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -435,11 +380,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>15</FileNumber>
-=======
       <FileNumber>16</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -451,11 +392,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>16</FileNumber>
-=======
       <FileNumber>17</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -467,11 +404,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>17</FileNumber>
-=======
       <FileNumber>18</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -483,11 +416,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>18</FileNumber>
-=======
       <FileNumber>19</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -499,11 +428,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>19</FileNumber>
-=======
       <FileNumber>20</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -515,11 +440,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>20</FileNumber>
-=======
       <FileNumber>21</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -531,11 +452,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>21</FileNumber>
-=======
       <FileNumber>22</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -547,11 +464,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>22</FileNumber>
-=======
       <FileNumber>23</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -563,11 +476,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>23</FileNumber>
-=======
       <FileNumber>24</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -579,11 +488,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>24</FileNumber>
-=======
       <FileNumber>25</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -595,11 +500,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>25</FileNumber>
-=======
       <FileNumber>26</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -611,11 +512,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>26</FileNumber>
-=======
       <FileNumber>27</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -635,11 +532,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>27</FileNumber>
-=======
       <FileNumber>28</FileNumber>
->>>>>>> updata
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -651,21 +544,6 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-<<<<<<< HEAD
-      <FileNumber>28</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\User\stm32f10x_it.c</PathWithFileName>
-      <FilenameWithoutPath>stm32f10x_it.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
-    <File>
-      <GroupNumber>4</GroupNumber>
-=======
->>>>>>> updata
       <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
@@ -678,19 +556,8 @@
     </File>
   </Group>
 
-  <Group>
-<<<<<<< HEAD
-    <GroupName>hardware</GroupName>
-    <tvExp>0</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <RteFlg>0</RteFlg>
-  </Group>
-
   <Group>
     <GroupName>system</GroupName>
-=======
-    <GroupName>system</GroupName>
     <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
@@ -771,8 +638,7 @@
 
   <Group>
     <GroupName>drive</GroupName>
->>>>>>> updata
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>

+ 0 - 40
project_Template/Project/myProject.uvprojx

@@ -10,21 +10,13 @@
       <TargetName>Target 1</TargetName>
       <ToolsetNumber>0x4</ToolsetNumber>
       <ToolsetName>ARM-ADS</ToolsetName>
-<<<<<<< HEAD
-      <pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
-=======
       <pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed>
->>>>>>> updata
       <uAC6>0</uAC6>
       <TargetOption>
         <TargetCommonOption>
           <Device>STM32F103C8</Device>
           <Vendor>STMicroelectronics</Vendor>
-<<<<<<< HEAD
-          <PackID>Keil.STM32F1xx_DFP.2.4.0</PackID>
-=======
           <PackID>Keil.STM32F1xx_DFP.2.3.0</PackID>
->>>>>>> updata
           <PackURL>http://www.keil.com/pack/</PackURL>
           <Cpu>IRAM(0x20000000,0x5000) IROM(0x08000000,0x10000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE</Cpu>
           <FlashUtilSpec></FlashUtilSpec>
@@ -193,10 +185,7 @@
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
             <RvdsMve>0</RvdsMve>
-<<<<<<< HEAD
-=======
             <RvdsCdeCp>0</RvdsCdeCp>
->>>>>>> updata
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
@@ -350,11 +339,7 @@
               <MiscControls></MiscControls>
               <Define>STM32F10X_MD,USE_STDPERIPH_DRIVER</Define>
               <Undefine></Undefine>
-<<<<<<< HEAD
-              <IncludePath>..\Libraries\FWlib\inc;..\Libraries\CMSIS;..\User;..\Hardware;..\System</IncludePath>
-=======
               <IncludePath>..\Libraries\FWlib\inc;..\Libraries\CMSIS;..\User;..\Drive;..\System</IncludePath>
->>>>>>> updata
             </VariousControls>
           </Cads>
           <Aads>
@@ -367,11 +352,7 @@
             <NoWarn>0</NoWarn>
             <uSurpInc>0</uSurpInc>
             <useXO>0</useXO>
-<<<<<<< HEAD
-            <uClangAs>0</uClangAs>
-=======
             <ClangAsOpt>4</ClangAsOpt>
->>>>>>> updata
             <VariousControls>
               <MiscControls></MiscControls>
               <Define></Define>
@@ -422,14 +403,11 @@
               <FileType>1</FileType>
               <FilePath>..\Libraries\CMSIS\system_stm32f10x.c</FilePath>
             </File>
-<<<<<<< HEAD
-=======
             <File>
               <FileName>stm32f10x_it.c</FileName>
               <FileType>1</FileType>
               <FilePath>..\Libraries\CMSIS\stm32f10x_it.c</FilePath>
             </File>
->>>>>>> updata
           </Files>
         </Group>
         <Group>
@@ -561,14 +539,6 @@
               <FilePath>..\User\main.c</FilePath>
             </File>
             <File>
-<<<<<<< HEAD
-              <FileName>stm32f10x_it.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\User\stm32f10x_it.c</FilePath>
-            </File>
-            <File>
-=======
->>>>>>> updata
               <FileName>handle.c</FileName>
               <FileType>1</FileType>
               <FilePath>..\User\handle.c</FilePath>
@@ -576,12 +546,6 @@
           </Files>
         </Group>
         <Group>
-<<<<<<< HEAD
-          <GroupName>hardware</GroupName>
-        </Group>
-        <Group>
-          <GroupName>system</GroupName>
-=======
           <GroupName>system</GroupName>
           <Files>
             <File>
@@ -618,7 +582,6 @@
         </Group>
         <Group>
           <GroupName>drive</GroupName>
->>>>>>> updata
         </Group>
       </Groups>
     </Target>
@@ -630,8 +593,6 @@
     <files/>
   </RTE>
 
-<<<<<<< HEAD
-=======
   <LayerInfo>
     <Layers>
       <Layer>
@@ -641,5 +602,4 @@
     </Layers>
   </LayerInfo>
 
->>>>>>> updata
 </Project>

+ 44 - 19
project_Template/System/GPIO.c

@@ -17,19 +17,35 @@ GPIOClassStruct GPIOClass = {
 // LEDRun
 #define LEDRun_GPIO_PORT    			GPIOB			              /* GPIO端口 */
 #define LEDRun_GPIO_CLK 	    		RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
-#define LEDRun_GPIO_PIN						GPIO_Pin_5			        /* 连接到SCL时钟线的GPIO */
+#define LEDRun_GPIO_PIN						GPIO_Pin_8			        /* 连接到SCL时钟线的GPIO */
 #define LEDRun_GPIO_TOGGLE		 		LEDRun_GPIO_PORT->BSRR = ((LEDRun_GPIO_PORT->ODR & LEDRun_GPIO_PIN) << 16) | (~LEDRun_GPIO_PORT->ODR & LEDRun_GPIO_PIN)
 #define LEDRun_GPIO_SET			   		LEDRun_GPIO_PORT->BSRR = (uint32_t)LEDRun_GPIO_PIN // 置1
 #define LEDRun_GPIO_RESET		   		LEDRun_GPIO_PORT->BSRR = (uint32_t)LEDRun_GPIO_PIN<<16 // 置0
 #define LEDRun_GPIO_READ					((LEDRun_GPIO_PORT->IDR & LEDRun_GPIO_PIN) != 0)
-// FAN
-#define FAN_GPIO_PORT    					GPIOB			              /* GPIO端口 */
-#define FAN_GPIO_CLK 	    				RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
-#define FAN_GPIO_PIN							GPIO_Pin_9			        /* 连接到SCL时钟线的GPIO */
-#define FAN_GPIO_TOGGLE		 				FAN_GPIO_PORT->BSRR = ((FAN_GPIO_PORT->ODR & FAN_GPIO_PIN) << 16) | (~FAN_GPIO_PORT->ODR & FAN_GPIO_PIN)
-#define FAN_GPIO_SET			   			FAN_GPIO_PORT->BSRR = (uint32_t)FAN_GPIO_PIN // 置1
-#define FAN_GPIO_RESET		   			FAN_GPIO_PORT->BSRR = (uint32_t)FAN_GPIO_PIN<<16 // 置0
-#define FAN_GPIO_READ							((FAN_GPIO_PORT->IDR & FAN_GPIO_PIN) != 0)
+// LED1
+#define LED1_GPIO_PORT    				GPIOA			              /* GPIO端口 */
+#define LED1_GPIO_CLK 	    			RCC_APB2Periph_GPIOA		/* GPIO端口时钟 */
+#define LED1_GPIO_PIN							GPIO_Pin_6			        /* 连接到SCL时钟线的GPIO */
+#define LED1_GPIO_TOGGLE		 			LED1_GPIO_PORT->BSRR = ((LED1_GPIO_PORT->ODR & LED1_GPIO_PIN) << 16) | (~LED1_GPIO_PORT->ODR & LED1_GPIO_PIN)
+#define LED1_GPIO_SET			   			LED1_GPIO_PORT->BSRR = (uint32_t)LED1_GPIO_PIN // 置1
+#define LED1_GPIO_RESET		   			LED1_GPIO_PORT->BSRR = (uint32_t)LED1_GPIO_PIN<<16 // 置0
+#define LED1_GPIO_READ						((LED1_GPIO_PORT->IDR & LED1_GPIO_PIN) != 0)
+// LED2
+#define LED2_GPIO_PORT    				GPIOA			              /* GPIO端口 */
+#define LED2_GPIO_CLK 	    			RCC_APB2Periph_GPIOA		/* GPIO端口时钟 */
+#define LED2_GPIO_PIN							GPIO_Pin_5			        /* 连接到SCL时钟线的GPIO */
+#define LED2_GPIO_TOGGLE		 			LED2_GPIO_PORT->BSRR = ((LED2_GPIO_PORT->ODR & LED2_GPIO_PIN) << 16) | (~LED2_GPIO_PORT->ODR & LED2_GPIO_PIN)
+#define LED2_GPIO_SET			   			LED2_GPIO_PORT->BSRR = (uint32_t)LED2_GPIO_PIN // 置1
+#define LED2_GPIO_RESET		   			LED2_GPIO_PORT->BSRR = (uint32_t)LED2_GPIO_PIN<<16 // 置0
+#define LED2_GPIO_READ						((LED2_GPIO_PORT->IDR & LED2_GPIO_PIN) != 0)
+// LED3
+#define LED3_GPIO_PORT    				GPIOA			              /* GPIO端口 */
+#define LED3_GPIO_CLK 	    			RCC_APB2Periph_GPIOA		/* GPIO端口时钟 */
+#define LED3_GPIO_PIN							GPIO_Pin_4			        /* 连接到SCL时钟线的GPIO */
+#define LED3_GPIO_TOGGLE		 			LED3_GPIO_PORT->BSRR = ((LED3_GPIO_PORT->ODR & LED3_GPIO_PIN) << 16) | (~LED3_GPIO_PORT->ODR & LED3_GPIO_PIN)
+#define LED3_GPIO_SET			   			LED3_GPIO_PORT->BSRR = (uint32_t)LED3_GPIO_PIN // 置1
+#define LED3_GPIO_RESET		   			LED3_GPIO_PORT->BSRR = (uint32_t)LED3_GPIO_PIN<<16 // 置0
+#define LED3_GPIO_READ						((LED3_GPIO_PORT->IDR & LED3_GPIO_PIN) != 0)
 
 /**
   * @brief  IO配置
@@ -42,8 +58,7 @@ static void GPIO_Config(void)
 	GPIO_InitTypeDef GPIO_InitStructure;
 	
 	/*开启LED相关的GPIO外设时钟*/
-	RCC_APB2PeriphClockCmd(LEDRun_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);
-	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
+	RCC_APB2PeriphClockCmd(LEDRun_GPIO_CLK, ENABLE);
 	GPIO_InitStructure.GPIO_Pin = LEDRun_GPIO_PIN;	
 	/*设置引脚模式为*/
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
@@ -54,10 +69,12 @@ static void GPIO_Config(void)
 	/*关闭*/
 	LEDRun_GPIO_SET;
 	
-	RCC_APB2PeriphClockCmd(FAN_GPIO_CLK, ENABLE);
-	GPIO_InitStructure.GPIO_Pin = FAN_GPIO_PIN;	
-	GPIO_Init(FAN_GPIO_PORT, &GPIO_InitStructure);	
-	FAN_GPIO_SET;
+	RCC_APB2PeriphClockCmd(LED1_GPIO_CLK, ENABLE);
+	GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN | LED2_GPIO_PIN | LED3_GPIO_PIN;	
+	GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);	
+	LED1_GPIO_SET;
+	LED2_GPIO_SET;
+	LED3_GPIO_SET;
 }
 /**
   * @brief  IO置高
@@ -69,7 +86,9 @@ static void GPIO_Set(uint8_t who)
 	switch(who)
 	{
 		case LED_Run: LEDRun_GPIO_SET;break;
-		case FAN: FAN_GPIO_SET;break;
+		case LED1: LED1_GPIO_SET;break;
+		case LED2: LED2_GPIO_SET;break;
+		case LED3: LED3_GPIO_SET;break;
 	}
 }
 /**
@@ -82,7 +101,9 @@ static void GPIO_Reset(uint8_t who)
 	switch(who)
 	{
 		case LED_Run: LEDRun_GPIO_RESET;break;
-		case FAN: FAN_GPIO_RESET;break;
+		case LED1: LED1_GPIO_RESET;break;
+		case LED2: LED2_GPIO_RESET;break;
+		case LED3: LED3_GPIO_RESET;break;
 	}
 }
 /**
@@ -95,7 +116,9 @@ static void GPIO_Toggle(uint8_t who)
 	switch(who)
 	{
 		case LED_Run: LEDRun_GPIO_TOGGLE;break;
-		case FAN: FAN_GPIO_TOGGLE;break;
+		case LED1: LED1_GPIO_TOGGLE;break;
+		case LED2: LED2_GPIO_TOGGLE;break;
+		case LED3: LED3_GPIO_TOGGLE;break;
 	}
 }
 /**
@@ -109,7 +132,9 @@ static uint8_t GPIO_Get(uint8_t who)
 	switch(who)
 	{
 		case LED_Run: temp = LEDRun_GPIO_READ;break;
-		case FAN: temp = FAN_GPIO_READ;break;
+		case LED1: temp = LED1_GPIO_READ;break;
+		case LED2: temp = LED2_GPIO_READ;break;
+		case LED3: temp = LED3_GPIO_READ;break;
 	}
 	return temp;
 }

+ 3 - 1
project_Template/System/GPIO.h

@@ -19,7 +19,9 @@ typedef struct {
 
 typedef enum {
 	LED_Run = 0,
-	FAN
+	LED1,
+	LED2,
+	LED3
 } GPIOxEnum;
 
 extern GPIOClassStruct GPIOClass;

+ 1 - 1
project_Template/System/TIM.c

@@ -99,7 +99,7 @@ void TIM2_Init(uint16_t arr, uint16_t psc)
 	// 设置中断来源
 	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;	
 	// 设置主优先级为 0
-	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	 
+	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;	 
 	// 设置抢占优先级为3
 	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	
 	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

+ 28 - 7
project_Template/System/USART.c

@@ -3,17 +3,19 @@
 static void USART1_Init(uint32_t baudRate);
 static void USART2_Init(uint32_t baudRate);
 static void USART3_Init(uint32_t baudRate);
-static void USART_SendString(USART_TypeDef* USARTx, uint8_t *str);
+static void USART_SendString1(USART_TypeDef *USARTx, uint8_t *str, uint16_t len);
+static void USART_SendString2(USART_TypeDef* USARTx, uint8_t *str);
 
 USARTClassStruct USARTClass = {
 	.USART1_Init = USART1_Init,
 	.USART2_Init = USART2_Init,
 	.USART3_Init = USART3_Init,
-	.USART_SendString = USART_SendString
+	.USART_SendString1 = USART_SendString1,
+	.USART_SendString2 = USART_SendString2
 };
 
 #define use_USART1
-//#define use_USART2
+#define use_USART2
 //#define use_USART3
 #define DEBUG_USART	USART1
 
@@ -91,7 +93,7 @@ static void USART1_Init(uint32_t baudRate)
 	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);	//中断控制器分组设置
 	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
 	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
+	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
 	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 	NVIC_Init(&NVIC_InitStructure);
 #endif	
@@ -145,7 +147,7 @@ static void USART2_Init(uint32_t baudRate)
 	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);	//中断控制器分组设置
 	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
 	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
+	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 	NVIC_Init(&NVIC_InitStructure);
 #endif	
@@ -205,12 +207,31 @@ static void USART3_Init(uint32_t baudRate)
 #endif	
 }
 /**
-	* @brief  USART发送字符串
+	* @brief  USART发送定长字符串
+	* @param  USARTx: 串口几发送
+	* @param  str: 发送的内容
+	* @param 	len: 长度
+  * @retval None
+  */
+static void USART_SendString1(USART_TypeDef *USARTx, uint8_t *str, uint16_t len)
+{
+
+	unsigned short count = 0;
+	
+	for(; count < len; count++)
+	{
+		USART_SendData(USARTx, *str++);									//发送数据
+		while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);		//等待发送完成
+	}
+
+}
+/**
+	* @brief  USART发送不定长字符串
 	* @param  USARTx: 串口几发送
 	* @param  str: 发送的内容
   * @retval None
   */
-static void USART_SendString(USART_TypeDef* USARTx, uint8_t *str)
+static void USART_SendString2(USART_TypeDef* USARTx, uint8_t *str)
 {
 	unsigned int k=0;
   do 

+ 2 - 1
project_Template/System/USART.h

@@ -7,7 +7,8 @@ typedef struct {
 	void (* USART1_Init)(uint32_t baudRate);
 	void (* USART2_Init)(uint32_t baudRate);
 	void (* USART3_Init)(uint32_t baudRate);
-	void (* USART_SendString)(USART_TypeDef* USARTx, uint8_t *str);
+	void (* USART_SendString1)(USART_TypeDef *USARTx, uint8_t *str, uint16_t len);
+	void (* USART_SendString2)(USART_TypeDef* USARTx, uint8_t *str);
 } USARTClassStruct;
 
 extern USARTClassStruct USARTClass;

+ 25 - 6
project_Template/User/handle.c

@@ -5,25 +5,44 @@ AllFlagStruct AllFlag = {
 };
 
 
-
 /**
   * @brief  系统初始化
   * @param  None
   * @retval None
-  * @note   None
   */
 void SYSTEM_Init(void)
 {
-
+	GPIOClass.Init();
+	TIMClass.TIM2_Init(100-1, 7200-1); // 10ms
+#ifdef DEBUG_printf
+	USARTClass.USART1_Init(115200);
+	printf("begin\n");
+#endif
+	
 }
 /**
   * @brief  任务处理
   * @param  None
   * @retval None
-  * @note   None
   */
 void TASK_Schedule(void)
 {
-
+	
+}
+/**
+  * @brief  TIM2中断函数
+  * @param  None
+  * @retval None
+  */
+void TIM2_IRQHandler(void)
+{
+	if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) 
+	{	
+		static uint16_t TIM2_Count1 = 0;
+		TIM2_Count1++;
+		if(TIM2_Count1 % 50 == 0) GPIOClass.Toggle(LED_Run);
+		
+		if(TIM2_Count1 >= 60000) TIM2_Count1 = 0;
+		TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
+	}	
 }
-

+ 1 - 1
project_Template/User/handle.h

@@ -3,7 +3,7 @@
 
 #include "main.h"
 
-//#define DEBUG_printf
+#define DEBUG_printf
 //#define LOG_printf
 
 typedef struct {

+ 2 - 10
project_Template/User/main.h

@@ -7,14 +7,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdarg.h>
 // system
-<<<<<<< HEAD
-//#include "DELAY.h"
-//#include "TIM.h"
-//#include "USART.h"
-//#include "GPIO.h"
-// peripheral
-=======
 #include "RCC.h"
 #include "DELAY.h"
 #include "WDOG.h"
@@ -22,9 +16,7 @@
 #include "USART.h"
 #include "GPIO.h"
 // drive
->>>>>>> updata
-//#include "BUTTON.h"
-//#include "OLED.h"
+
 // user
 #include "handle.h"
 

+ 0 - 75
project_Template/User/stm32f10x_conf.h

@@ -1,75 +0,0 @@
-/**
-  ******************************************************************************
-  * @file    Project/STM32F10x_StdPeriph_Template/stm32f10x_conf.h 
-  * @author  MCD Application Team
-  * @version V3.6.0
-  * @date    20-September-2021
-  * @brief   Library configuration file.
-  ******************************************************************************
-  * @attention
-  *
-  * Copyright (c) 2011 STMicroelectronics.
-  * All rights reserved.
-  *
-  * This software is licensed under terms that can be found in the LICENSE file
-  * in the root directory of this software component.
-  * If no LICENSE file comes with this software, it is provided AS-IS.
-  *
-  ******************************************************************************
-  */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F10x_CONF_H
-#define __STM32F10x_CONF_H
-
-/* Includes ------------------------------------------------------------------*/
-/* Uncomment/Comment the line below to enable/disable peripheral header file inclusion */
-#include "stm32f10x_adc.h"
-#include "stm32f10x_bkp.h"
-#include "stm32f10x_can.h"
-#include "stm32f10x_cec.h"
-#include "stm32f10x_crc.h"
-#include "stm32f10x_dac.h"
-#include "stm32f10x_dbgmcu.h"
-#include "stm32f10x_dma.h"
-#include "stm32f10x_exti.h"
-#include "stm32f10x_flash.h"
-#include "stm32f10x_fsmc.h"
-#include "stm32f10x_gpio.h"
-#include "stm32f10x_i2c.h"
-#include "stm32f10x_iwdg.h"
-#include "stm32f10x_pwr.h"
-#include "stm32f10x_rcc.h"
-#include "stm32f10x_rtc.h"
-#include "stm32f10x_sdio.h"
-#include "stm32f10x_spi.h"
-#include "stm32f10x_tim.h"
-#include "stm32f10x_usart.h"
-#include "stm32f10x_wwdg.h"
-#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-/* Uncomment the line below to expanse the "assert_param" macro in the 
-   Standard Peripheral Library drivers code */
-/* #define USE_FULL_ASSERT    1 */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef  USE_FULL_ASSERT
-
-/**
-  * @brief  The assert_param macro is used for function's parameters check.
-  * @param  expr: If expr is false, it calls assert_failed function which reports 
-  *         the name of the source file and the source line number of the call 
-  *         that failed. If expr is true, it returns no value.
-  * @retval None
-  */
-  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
-  void assert_failed(uint8_t* file, uint32_t line);
-#else
-  #define assert_param(expr) ((void)0)
-#endif /* USE_FULL_ASSERT */
-
-#endif /* __STM32F10x_CONF_H */
-

+ 0 - 158
project_Template/User/stm32f10x_it.c

@@ -1,158 +0,0 @@
-/**
-  ******************************************************************************
-  * @file    Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c 
-  * @author  MCD Application Team
-  * @version V3.6.0
-  * @date    20-September-2021
-  * @brief   Main Interrupt Service Routines.
-  *          This file provides template for all exceptions handler and 
-  *          peripherals interrupt service routine.
-  ******************************************************************************
-  * @attention
-  *
-  * Copyright (c) 2011 STMicroelectronics.
-  * All rights reserved.
-  *
-  * This software is licensed under terms that can be found in the LICENSE file
-  * in the root directory of this software component.
-  * If no LICENSE file comes with this software, it is provided AS-IS.
-  *
-  ******************************************************************************
-  */
-
-/* Includes ------------------------------------------------------------------*/
-#include "stm32f10x_it.h"
-
-/** @addtogroup STM32F10x_StdPeriph_Template
-  * @{
-  */
-
-/* Private typedef -----------------------------------------------------------*/
-/* Private define ------------------------------------------------------------*/
-/* Private macro -------------------------------------------------------------*/
-/* Private variables ---------------------------------------------------------*/
-/* Private function prototypes -----------------------------------------------*/
-/* Private functions ---------------------------------------------------------*/
-
-/******************************************************************************/
-/*            Cortex-M3 Processor Exceptions Handlers                         */
-/******************************************************************************/
-
-/**
-  * @brief  This function handles NMI exception.
-  * @param  None
-  * @retval None
-  */
-void NMI_Handler(void)
-{
-}
-
-/**
-  * @brief  This function handles Hard Fault exception.
-  * @param  None
-  * @retval None
-  */
-void HardFault_Handler(void)
-{
-  /* Go to infinite loop when Hard Fault exception occurs */
-  while (1)
-  {
-  }
-}
-
-/**
-  * @brief  This function handles Memory Manage exception.
-  * @param  None
-  * @retval None
-  */
-void MemManage_Handler(void)
-{
-  /* Go to infinite loop when Memory Manage exception occurs */
-  while (1)
-  {
-  }
-}
-
-/**
-  * @brief  This function handles Bus Fault exception.
-  * @param  None
-  * @retval None
-  */
-void BusFault_Handler(void)
-{
-  /* Go to infinite loop when Bus Fault exception occurs */
-  while (1)
-  {
-  }
-}
-
-/**
-  * @brief  This function handles Usage Fault exception.
-  * @param  None
-  * @retval None
-  */
-void UsageFault_Handler(void)
-{
-  /* Go to infinite loop when Usage Fault exception occurs */
-  while (1)
-  {
-  }
-}
-
-/**
-  * @brief  This function handles SVCall exception.
-  * @param  None
-  * @retval None
-  */
-void SVC_Handler(void)
-{
-}
-
-/**
-  * @brief  This function handles Debug Monitor exception.
-  * @param  None
-  * @retval None
-  */
-void DebugMon_Handler(void)
-{
-}
-
-/**
-  * @brief  This function handles PendSVC exception.
-  * @param  None
-  * @retval None
-  */
-void PendSV_Handler(void)
-{
-}
-
-/**
-  * @brief  This function handles SysTick Handler.
-  * @param  None
-  * @retval None
-  */
-void SysTick_Handler(void)
-{
-}
-
-/******************************************************************************/
-/*                 STM32F10x Peripherals Interrupt Handlers                   */
-/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
-/*  available peripheral interrupt handler's name please refer to the startup */
-/*  file (startup_stm32f10x_xx.s).                                            */
-/******************************************************************************/
-
-/**
-  * @brief  This function handles PPP interrupt request.
-  * @param  None
-  * @retval None
-  */
-/*void PPP_IRQHandler(void)
-{
-}*/
-
-/**
-  * @}
-  */ 
-
-

+ 0 - 52
project_Template/User/stm32f10x_it.h

@@ -1,52 +0,0 @@
-/**
-  ******************************************************************************
-  * @file    Project/STM32F10x_StdPeriph_Template/stm32f10x_it.h 
-  * @author  MCD Application Team
-  * @version V3.6.0
-  * @date    20-September-2021
-  * @brief   This file contains the headers of the interrupt handlers.
-  ******************************************************************************
-  * @attention
-  *
-  * Copyright (c) 2011 STMicroelectronics.
-  * All rights reserved.
-  *
-  * This software is licensed under terms that can be found in the LICENSE file
-  * in the root directory of this software component.
-  * If no LICENSE file comes with this software, it is provided AS-IS.
-  *
-  ******************************************************************************
-  */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F10x_IT_H
-#define __STM32F10x_IT_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif 
-
-/* Includes ------------------------------------------------------------------*/
-#include "stm32f10x.h"
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/* Exported functions ------------------------------------------------------- */
-
-void NMI_Handler(void);
-void HardFault_Handler(void);
-void MemManage_Handler(void);
-void BusFault_Handler(void);
-void UsageFault_Handler(void);
-void SVC_Handler(void);
-void DebugMon_Handler(void);
-void PendSV_Handler(void);
-void SysTick_Handler(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F10x_IT_H */
-

+ 14 - 25
system_Template/EXTI.c

@@ -6,30 +6,20 @@ EXTIClassStruct EXTIClass = {
 	.Init = EXTI_Config
 };
 
-#define EXTI1_PORT		GPIOA
-#define EXTI1_CLK			(RCC_APB2Periph_GPIOA)
-#define EXTI1_PIN			GPIO_Pin_15
-#define EXTI2_PORT		GPIOB
-#define EXTI2_CLK			(RCC_APB2Periph_GPIOB)
-#define EXTI2_PIN			GPIO_Pin_3
+#define EXTI1_PORT		GPIOB
+#define EXTI1_CLK			(RCC_APB2Periph_GPIOB)
+#define EXTI1_PIN			GPIO_Pin_3
 		
 static void EXTI_Config(void)
 {
 	GPIO_InitTypeDef GPIO_InitStructure;
 	EXTI_InitTypeDef EXTI_InitStructure;
 	
-	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
-	RCC_APB2PeriphClockCmd(EXTI1_CLK | RCC_APB2Periph_AFIO, ENABLE);
-
+	RCC_APB2PeriphClockCmd(EXTI1_CLK, ENABLE);
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 	GPIO_InitStructure.GPIO_Pin = EXTI1_PIN;
 	GPIO_Init(EXTI1_PORT, &GPIO_InitStructure);
-	
-	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
-	RCC_APB2PeriphClockCmd(EXTI2_CLK | RCC_APB2Periph_AFIO, ENABLE);
-	
-	GPIO_InitStructure.GPIO_Pin = EXTI2_PIN;
-	GPIO_Init(EXTI2_PORT, &GPIO_InitStructure);
+
 //	// 配置EXTI的信号源
 //	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);
 //	EXTI_InitStructure.EXTI_Line = EXTI_Line3;  // 产生中断的管脚号
@@ -37,21 +27,20 @@ static void EXTI_Config(void)
 //	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  // 中断的触发方式 Rising上升沿/Falling下降沿
 //	EXTI_InitStructure.EXTI_LineCmd = ENABLE;  // 使能或失能中断
 //	EXTI_Init(&EXTI_InitStructure);
-//	
-//	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
-//	EXTI_InitStructure.EXTI_Line = EXTI_Line15;  // 产生中断的管脚号
-//	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  // 模式 Interrupt中断/Event事件
-//	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  // 中断的触发方式 Rising上升沿/Falling下降沿
-//	EXTI_InitStructure.EXTI_LineCmd = ENABLE;  // 使能或失能中断
-//	EXTI_Init(&EXTI_InitStructure);
+//	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
+//	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;	
+//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;	 
+//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	
+//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+//	NVIC_Init(&NVIC_InitStructure);
 }
 /* 在别处复现此函数  外部中断函数
-void EXTI0_IRQHandler(void)
+void EXTI3_IRQHandler(void)
 {
-	if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
+	if (EXTI_GetITStatus(EXTI_Line3) != RESET) {
 
 	}
-	EXTI_ClearITPendingBit(EXTI_Line0);
+	EXTI_ClearITPendingBit(EXTI_Line3);
 }
 */
 

+ 70 - 0
system_Template/NVIC.c

@@ -0,0 +1,70 @@
+#include "main.h"
+
+/*============================================================================================================================
+    NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority  | Description
+  ============================================================================================================================
+   NVIC_PriorityGroup_0  |                0                  |            0-15             |   0 bits for pre-emption priority
+                         |                                   |                             |   4 bits for subpriority
+  ----------------------------------------------------------------------------------------------------------------------------
+   NVIC_PriorityGroup_1  |                0-1                |            0-7              |   1 bits for pre-emption priority
+                         |                                   |                             |   3 bits for subpriority
+  ----------------------------------------------------------------------------------------------------------------------------    
+   NVIC_PriorityGroup_2  |                0-3                |            0-3              |   2 bits for pre-emption priority
+                         |                                   |                             |   2 bits for subpriority
+  ----------------------------------------------------------------------------------------------------------------------------    
+   NVIC_PriorityGroup_3  |                0-7                |            0-1              |   3 bits for pre-emption priority
+                         |                                   |                             |   1 bits for subpriority
+  ----------------------------------------------------------------------------------------------------------------------------    
+   NVIC_PriorityGroup_4  |                0-15               |            0                |   4 bits for pre-emption priority
+                         |                                   |                             |   0 bits for subpriority                       
+  ============================================================================================================================*/
+
+static void NVIC_Config(void);
+
+NVICClassStruct NVICClass = {
+	.Init = NVIC_Config
+};
+
+static void NVIC_Config()
+{
+	NVIC_InitTypeDef NVIC_InitStructure;
+	
+	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
+
+//	NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
+//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     		// Ö÷ÓÅÏȼ¶Îª1
+//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            		// ´ÎÓÅÏȼ¶Îª0
+//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+//	NVIC_Init(&NVIC_InitStructure);
+
+//	NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;	
+//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	 
+//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	
+//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+//	NVIC_Init(&NVIC_InitStructure);
+	
+	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;	
+	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;	 
+	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	
+	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+	NVIC_Init(&NVIC_InitStructure);
+	
+//	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;	
+//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	 
+//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	
+//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+//	NVIC_Init(&NVIC_InitStructure);
+
+//	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;	
+//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;	 
+//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	
+//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+//	NVIC_Init(&NVIC_InitStructure);
+//	
+//	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;	
+//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;	 
+//	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	
+//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+//	NVIC_Init(&NVIC_InitStructure);
+}
+

+ 13 - 0
system_Template/NVIC.h

@@ -0,0 +1,13 @@
+#ifndef __NVIC_AS_H_
+#define __NVIC_AS_H_
+
+#include "main.h"
+
+typedef struct {
+	void (* Init)(void);
+} NVICClassStruct;
+
+extern NVICClassStruct NVICClass;
+
+#endif
+

+ 28 - 7
system_Template/USART.c

@@ -3,17 +3,19 @@
 static void USART1_Init(uint32_t baudRate);
 static void USART2_Init(uint32_t baudRate);
 static void USART3_Init(uint32_t baudRate);
-static void USART_SendString(USART_TypeDef* USARTx, uint8_t *str);
+static void USART_SendString1(USART_TypeDef *USARTx, uint8_t *str, uint16_t len);
+static void USART_SendString2(USART_TypeDef* USARTx, uint8_t *str);
 
 USARTClassStruct USARTClass = {
 	.USART1_Init = USART1_Init,
 	.USART2_Init = USART2_Init,
 	.USART3_Init = USART3_Init,
-	.USART_SendString = USART_SendString
+	.USART_SendString1 = USART_SendString1,
+	.USART_SendString2 = USART_SendString2
 };
 
 #define use_USART1
-//#define use_USART2
+#define use_USART2
 //#define use_USART3
 #define DEBUG_USART	USART1
 
@@ -91,7 +93,7 @@ static void USART1_Init(uint32_t baudRate)
 	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);	//中断控制器分组设置
 	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
 	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
+	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
 	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 	NVIC_Init(&NVIC_InitStructure);
 #endif	
@@ -145,7 +147,7 @@ static void USART2_Init(uint32_t baudRate)
 	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);	//中断控制器分组设置
 	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
 	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
+	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 	NVIC_Init(&NVIC_InitStructure);
 #endif	
@@ -205,12 +207,31 @@ static void USART3_Init(uint32_t baudRate)
 #endif	
 }
 /**
-	* @brief  USART发送字符串
+	* @brief  USART发送定长字符串
+	* @param  USARTx: 串口几发送
+	* @param  str: 发送的内容
+	* @param 	len: 长度
+  * @retval None
+  */
+static void USART_SendString1(USART_TypeDef *USARTx, uint8_t *str, uint16_t len)
+{
+
+	unsigned short count = 0;
+	
+	for(; count < len; count++)
+	{
+		USART_SendData(USARTx, *str++);									//发送数据
+		while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);		//等待发送完成
+	}
+
+}
+/**
+	* @brief  USART发送不定长字符串
 	* @param  USARTx: 串口几发送
 	* @param  str: 发送的内容
   * @retval None
   */
-static void USART_SendString(USART_TypeDef* USARTx, uint8_t *str)
+static void USART_SendString2(USART_TypeDef* USARTx, uint8_t *str)
 {
 	unsigned int k=0;
   do 

+ 2 - 1
system_Template/USART.h

@@ -7,7 +7,8 @@ typedef struct {
 	void (* USART1_Init)(uint32_t baudRate);
 	void (* USART2_Init)(uint32_t baudRate);
 	void (* USART3_Init)(uint32_t baudRate);
-	void (* USART_SendString)(USART_TypeDef* USARTx, uint8_t *str);
+	void (* USART_SendString1)(USART_TypeDef *USARTx, uint8_t *str, uint16_t len);
+	void (* USART_SendString2)(USART_TypeDef* USARTx, uint8_t *str);
 } USARTClassStruct;
 
 extern USARTClassStruct USARTClass;

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików