Jelajahi Sumber

增加模块,超声波,甲醛,PM2.5等

woshiashuai 2 tahun lalu
induk
melakukan
77d6d1837b

+ 1 - 0
module_Template/ASR_CI1122/启英泰伦CI1122离线语音模组.txt

@@ -0,0 +1 @@
+使用天问Block开发平台,选择TWEN-ASR设备

+ 205 - 0
module_Template/MEMS_CH2O甲醛/IIC.c

@@ -0,0 +1,205 @@
+#include "IIC.h"
+
+
+#define IIC_SDA_PORT		GPIOA
+#define IIC_SDA_CLK			(RCC_APB2Periph_GPIOA)
+#define IIC_SDA_PIN			GPIO_Pin_7
+#define IIC_SCL_PORT		GPIOB
+#define IIC_SCL_CLK			(RCC_APB2Periph_GPIOB)
+#define IIC_SCL_PIN			GPIO_Pin_0
+
+#define IIC_SCL_OUT_1		IIC_SCL_PORT->BSRR = (uint32_t)IIC_SCL_PIN // 置1
+#define IIC_SCL_OUT_0		IIC_SCL_PORT->BRR = (uint32_t)IIC_SCL_PIN
+#define IIC_SDA_OUT_1		IIC_SDA_PORT->BSRR = (uint32_t)IIC_SDA_PIN // 置1
+#define IIC_SDA_OUT_0		IIC_SDA_PORT->BRR = (uint32_t)IIC_SDA_PIN
+#define IIC_SDA_IN()		((IIC_SDA_PORT->IDR & IIC_SDA_PIN) != 0)
+
+/**
+  * @brief  IIC延时
+  * @param  None
+  * @retval None
+  */
+static void IIC_Delay(void)
+{
+	uint16_t i;
+	/* 
+	 	下面的时间是通过逻辑分析仪测试得到的。
+    工作条件:CPU主频72MHz ,MDK编译环境,1级优化
+  
+		循环次数为10时,SCL频率 = 205KHz 
+		循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us 
+	 	循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us 
+	*/
+	for (i = 0; i < 400; i++);
+}
+/**
+  * @brief  SDA输出方向配置
+  * @param  None
+  * @retval None
+  */
+void Set_IIC_SDA_OUT(void)
+{
+	GPIO_InitTypeDef GPIO_InitStructure;	
+	RCC_APB2PeriphClockCmd(IIC_SDA_CLK, ENABLE);
+	GPIO_InitStructure.GPIO_Pin=IIC_SDA_PIN;
+	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
+	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
+	GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure); 						
+}
+/**
+  * @brief  SDA输入方向配置
+  * @param  None
+  * @retval None
+  */
+void Set_IIC_SDA_IN(void)
+{
+	GPIO_InitTypeDef GPIO_InitStructure;	
+	RCC_APB2PeriphClockCmd(IIC_SDA_CLK, ENABLE);
+	GPIO_InitStructure.GPIO_Pin=IIC_SDA_PIN;
+	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
+	GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
+}
+/**
+  * @brief  模拟IIC初始化
+  * @param  None
+  * @retval None
+  */
+void IIC_init()
+{
+	GPIO_InitTypeDef  GPIO_InitStructure;
+	RCC_APB2PeriphClockCmd(IIC_SDA_CLK | IIC_SCL_CLK, ENABLE);
+	GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
+	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; 		
+	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	
+	GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);	
+	GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN;
+	GPIO_Init(IIC_SCL_PORT, &GPIO_InitStructure);	
+	IIC_stop();
+}
+/**
+  * @brief  模拟IIC起始信号
+  * @param  None
+  * @retval None
+  */
+void IIC_start()
+{
+	Set_IIC_SDA_OUT();
+	IIC_SCL_OUT_1;
+	IIC_SDA_OUT_1;
+	IIC_Delay();
+	IIC_SDA_OUT_0;
+	IIC_Delay();
+	IIC_SCL_OUT_0;
+	IIC_Delay();
+}
+/**
+  * @brief  模拟IIC停止信号
+  * @param  None
+  * @retval None
+  */
+void IIC_stop()
+{
+	Set_IIC_SDA_OUT();
+	IIC_SCL_OUT_1;
+	IIC_SDA_OUT_0;
+	IIC_Delay();
+	IIC_SDA_OUT_1;
+}
+/**
+  * @brief  模拟IIC主机应答
+  * @param  None
+  * @retval None
+  */
+void IIC_ack()
+{
+	Set_IIC_SDA_OUT();
+	IIC_SDA_OUT_0;
+	IIC_Delay();
+	IIC_SCL_OUT_1;
+	IIC_Delay();
+	IIC_SCL_OUT_0;
+	IIC_Delay();	
+	IIC_SDA_OUT_1;
+}
+/**
+  * @brief  模拟IIC主机不应答
+  * @param  None
+  * @retval None
+  */
+void IIC_noack()
+{
+	Set_IIC_SDA_OUT();
+	IIC_SDA_OUT_1;
+	IIC_Delay();
+	IIC_SCL_OUT_1;
+	IIC_Delay();
+	IIC_SCL_OUT_0;
+	IIC_Delay();
+}
+/**
+  * @brief  模拟IIC等待从机应答
+  * @param  None
+  * @retval 1: 接收应答失败 0: 接收应答成功
+  */
+uint8_t IIC_wait_ack()
+{
+	uint8_t rec = 0;
+	Set_IIC_SDA_OUT();
+	IIC_SDA_OUT_1;
+	IIC_Delay();
+	Set_IIC_SDA_IN();
+	IIC_SCL_OUT_1;
+	IIC_Delay();
+	rec = IIC_SDA_IN();
+	IIC_SCL_OUT_0;
+	IIC_Delay();
+	
+	return rec;
+}
+/**
+  * @brief  模拟IIC发送一个字节
+  * @param  None
+  * @retval None
+  */
+void IIC_send_byte(uint8_t txd)
+{
+	uint8_t i=0;
+	Set_IIC_SDA_OUT();
+	for(i=0;i<8;i++)
+	{
+		if(txd&0x80) IIC_SDA_OUT_1;
+		else IIC_SDA_OUT_0;
+		IIC_Delay();
+		IIC_SCL_OUT_1;
+		IIC_Delay(); // 发送数据
+		IIC_SCL_OUT_0;
+		if(i == 7) IIC_SDA_OUT_1; // 最后一位数据发送完要释放SDA总线
+		txd <<= 1;
+		IIC_Delay();
+	}
+}
+/**
+  * @brief  模拟IIC读取一个字节
+  * @param  ack: 0,读完不产生应答 1,读完产生应答
+  * @retval 返回读取到的字节
+  */
+uint8_t IIC_read_byte(uint8_t ack)
+{
+	uint8_t i,receive=0;
+	Set_IIC_SDA_IN();
+	for(i=0;i<8;i++)
+	{
+		receive <<= 1;
+		IIC_SCL_OUT_1;
+		IIC_Delay();
+		if(IIC_SDA_IN()) receive++; // 连续读取八位
+		IIC_SCL_OUT_0;
+		IIC_Delay();	
+	}
+	if(!ack) IIC_noack();
+	else IIC_ack();
+
+	return receive; // 返回读取到的字节
+}
+
+	

+ 16 - 0
module_Template/MEMS_CH2O甲醛/IIC.h

@@ -0,0 +1,16 @@
+#ifndef __IIC_H
+#define __IIC_H
+
+#include "main.h"
+
+void Set_IIC_SDA_OUT(void);
+void Set_IIC_SDA_IN(void);
+void IIC_init(void);
+void IIC_start(void);
+void IIC_stop(void);
+void IIC_ack(void);
+void IIC_noack(void);
+uint8_t IIC_wait_ack(void);
+void IIC_send_byte(uint8_t txd);
+uint8_t IIC_read_byte(uint8_t ack);
+#endif

+ 36 - 0
module_Template/MEMS_CH2O甲醛/MEMS_CH2O.c

@@ -0,0 +1,36 @@
+#include "MEMS_CH2O.h"
+#include "IIC.h"
+
+
+/**
+  * @brief  MEMS数字甲醛传感器IIC端口初始化
+  * @param  None
+  * @retval	None
+  */
+void MEMS_CH2O_init(void)
+{
+	IIC_init(); // iic延时计数400
+}
+/**
+  * @brief  读取MEMS数字甲醛传感器检测浓度
+  * @param  None
+  * @retval 返回读取到的数据 2字节 0-100ppm 正常<=2
+  */
+uint16_t MEMS_CH2O_read(void)
+{
+	uint8_t recHigh = 0,recLow = 0;
+	IIC_start();
+	IIC_send_byte(MEMS_CH2O_wrAddr); // slave address + write cmd
+	if(IIC_wait_ack()) return 0xFFFF;
+	IIC_send_byte(0xA1); // read cmd
+	if(IIC_wait_ack()) return 0xFFFE;
+	IIC_start();
+	IIC_send_byte(MEMS_CH2O_rdAddr); // slave address + read cmd
+	if(IIC_wait_ack()) return 0xFFFD;
+	recHigh = IIC_read_byte(1);
+	recLow = IIC_read_byte(0);
+	IIC_stop();
+	return (uint16_t)recHigh << 8 | recLow;
+}
+
+

+ 12 - 0
module_Template/MEMS_CH2O甲醛/MEMS_CH2O.h

@@ -0,0 +1,12 @@
+#ifndef __MEMS_CH2O_H
+#define __MEMS_CH2O_H
+
+#include "main.h"
+
+#define MEMS_CH2O_wrAddr	0x54
+#define MEMS_CH2O_rdAddr	0x55
+
+void MEMS_CH2O_init(void);
+uint16_t MEMS_CH2O_read(void);
+
+#endif

TEMPAT SAMPAH
module_Template/MEMS_CH2O甲醛/MEMS数字甲醛传感器JED116-001.docx


TEMPAT SAMPAH
module_Template/MEMS_CH2O甲醛/MEMS甲醛接口图.jpg


+ 2 - 0
module_Template/MEMS_CH2O甲醛/淘宝链接.txt

@@ -0,0 +1,2 @@
+【淘宝】https://m.tb.cn/h.UpzPxRE?tk=f39fd82gKed CZ3457 「MEMS气体探头可燃气VOC氢气氨气硫化氢氟利昂乙醇空气质量传感器」
+点击链接直接打开 或者 淘宝搜索直接打开

TEMPAT SAMPAH
module_Template/PM2.5/DST02-N_JTS-GG-2019-001N承认书V1.0 (2).pdf


TEMPAT SAMPAH
module_Template/PM2.5/PM2.5接口图.jpg


+ 10 - 0
module_Template/PM2.5/PM2.5模拟量驱动与算法.txt

@@ -0,0 +1,10 @@
+模块量程:0-600ug/m3 
+输出电压:0-3.5V
+PM2.5正常范围:<50ug/m3
+驱动方法:
+1. 拉高LED_PWM引脚
+2. 延时500us
+3. 读取此刻的ADC电压值
+4. 拉低LED_PWM引脚
+
+算法:检测到的ug/m3=ADC电压值(单位V) / 3.5 * 600

+ 2 - 0
module_Template/PM2.5/淘宝链接.txt

@@ -0,0 +1,2 @@
+【淘宝】https://m.tb.cn/h.Up3A8wo?tk=ToW6d82gKLV CZ3457 「PM2.5空气质量传感器 灰尘浓度检测 细小颗粒物雾霾 替换夏普1051」
+点击链接直接打开 或者 淘宝搜索直接打开

+ 13 - 17
module_Template/SIM900A/GSM_config.c

@@ -1,15 +1,11 @@
 #include "main.h"
-//// C lib
-//#include <stdarg.h>	 	 
-//#include <stdio.h> 	 
-//#include <string.h>	 
 
 
 #if 0
 #define  GSM_USARTx                   USART1
 #define  GSM_USART_CLK                RCC_APB2Periph_USART1
 #define  GSM_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
-#define  GSM_USART_BAUDRATE           115200
+#define  GSM_USART_BAUDRATE           9600
 
 #define  GSM_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
 #define  GSM_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
@@ -48,7 +44,7 @@ char GSM_USART_TX_BUF[GSM_USART_MAX_SEND_LEN];
 volatile uint16_t GSM_USART_RX_STA = 0;   	
 
 // GSM串口中断处理
-void GSM_USART_IRQHandler(void)
+void USART2_IRQHandler(void)
 {
 	uint8_t res;	      
 	if(USART_GetITStatus(GSM_USARTx, USART_IT_RXNE) != RESET)
@@ -84,7 +80,7 @@ void TIM3_IRQHandler(void)
 }
 /**
   * @brief  GSM 10ms定时器初始化
-	* @param  None
+  * @param  None
   * @retval None
   * @note   用于检测GSM串口接收状态
 */
@@ -113,7 +109,7 @@ void GSM_TIM3_Init(void)
 }
 /**
   * @brief  GSM 串口初始化
-	* @param  bound: 波特率
+  * @param  bound: 波特率
   * @retval None
   * @note   None
 */
@@ -128,14 +124,14 @@ void GSM_USART_Init(uint32_t bound)
 
  	USART_DeInit(GSM_USARTx); 
 	//USART_TX
-  GPIO_InitStructure.GPIO_Pin = GSM_USART_TX_GPIO_PIN;
-  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
-  GPIO_Init(GSM_USART_TX_GPIO_PORT, &GPIO_InitStructure);
-  //USART_RX
-  GPIO_InitStructure.GPIO_Pin = GSM_USART_RX_GPIO_PIN;
-  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
-  GPIO_Init(GSM_USART_RX_GPIO_PORT, &GPIO_InitStructure);
+	GPIO_InitStructure.GPIO_Pin = GSM_USART_TX_GPIO_PIN;
+	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+	GPIO_Init(GSM_USART_TX_GPIO_PORT, &GPIO_InitStructure);
+	//USART_RX
+	GPIO_InitStructure.GPIO_Pin = GSM_USART_RX_GPIO_PIN;
+	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+	GPIO_Init(GSM_USART_RX_GPIO_PORT, &GPIO_InitStructure);
 	
 	USART_InitStructure.USART_BaudRate = bound;
 	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
@@ -146,7 +142,7 @@ void GSM_USART_Init(uint32_t bound)
 	USART_Init(GSM_USARTx, &USART_InitStructure);
 	
 	USART_Cmd(GSM_USARTx, ENABLE);
-  USART_ITConfig(GSM_USARTx, USART_IT_RXNE, ENABLE);
+	USART_ITConfig(GSM_USARTx, USART_IT_RXNE, ENABLE);
 	
 	NVIC_InitStructure.NVIC_IRQChannel = GSM_USART_IRQ;
 	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

+ 3 - 8
module_Template/SIM900A/GSM_config.h

@@ -1,18 +1,13 @@
 #ifndef __GSM_CONFIG_H
 #define __GSM_CONFIG_H	 
 
-#include "main.h" 	   
+#include "main.h"
 
-<<<<<<< HEAD
-#define GSM_USART_MAX_RECV_LEN		64		//	接收缓存大小
-#define GSM_USART_MAX_SEND_LEN		64		//  发送缓存大小
-=======
 #define GSM_USART_MAX_RECV_LEN		128		//	接收缓存大小
 #define GSM_USART_MAX_SEND_LEN		32		//  发送缓存大小
->>>>>>> updata
-#define GSM_USART_RX_EN 					1			//  接收使能标志
+#define GSM_USART_RX_EN 			1		//  接收使能标志
 
-#define  GSM_USARTx                   USART2
+#define  GSM_USARTx 				USART2
 
 extern char  GSM_USART_RX_BUF[GSM_USART_MAX_RECV_LEN]; 
 extern char  GSM_USART_TX_BUF[GSM_USART_MAX_SEND_LEN];

+ 30 - 89
module_Template/SIM900A/GSM_func.c

@@ -5,34 +5,23 @@
 //#include <stdio.h>
 //// system
 //#include "delay.h"
-//// GSM
-//#include "GSM_config.h"
+// GSM
+#include "GSM_config.h"
 
 
 static char* GSM_check_cmd(char *str);
-<<<<<<< HEAD
-static char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime);
-static char GSM_consta_check(void);
-static void GSM_get_wanip(char* ipbuf);
-static void GSM_sendData(char* fmt,...);
-
-// GSM信息  联网的GSM名称和密码
-const char* GSM_phoneNum="18782876903";
-const char* GSM_message="help me";
-=======
 static void GSM_sendData(char* fmt,...);
 
 // GSM信息
 const char* GSM_phoneNum = "19198022169";
 const char* GSM_head = "send:";
->>>>>>> updata
 
 /**
-	* @brief  向GSM串口发送数据
-	* @param  fmt: 类似printf的数据格式
+  * @brief  向GSM串口发送数据
+  * @param  fmt: 类似printf的数据格式
   * @retval None
   * @note   None
-*/
+  */
 void GSM_sendData(char* fmt,...)  
 {  
 	uint16_t i,j; 
@@ -48,26 +37,12 @@ void GSM_sendData(char* fmt,...)
 	} 
 }
 /**
-<<<<<<< HEAD
-	* @brief  清零缓存区并清零接收标志
-	* @param  None
-  * @retval None
-  * @note   None
-*/
-void GSM_clear(void)
-{
-	memset(GSM_USART_RX_BUF, 0, GSM_USART_MAX_RECV_LEN);
-	GSM_USART_RX_STA = 0;
-}
-/**
-=======
->>>>>>> updata
-	* @brief  检测应答
-	* @param  str: 期待的应答结果
+  * @brief  检测应答
+  * @param  str: 期待的应答结果
   * @retval 0: 没有接收到期待应答
-	* @retval !0: 其他值代表期待应答结果的位置
-	* @note   None
-*/
+  * @retval !0: 其他值代表期待应答结果的位置
+  * @note   None
+  */
 static char* GSM_check_cmd(char *str)
 {
 	char *strx=0;
@@ -85,19 +60,15 @@ static char* GSM_check_cmd(char *str)
 	return strx;
 }
 /**
-	* @brief  向GSM发送命令
-	* @param  cmd: 发送的命令字符串
-	* @param	ack: 期待的应答结果,如果为空,则表示不需要等待应答
-	* @param	waittime: 等待时间(单位:10ms)
-	* @retval 0: 发送成功(得到了期待的应答结果), 
-	* @retval	1: 发送失败
-	* @note   None
-*/
-<<<<<<< HEAD
-static char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime)
-=======
+  * @brief  向GSM发送命令
+  * @param  cmd: 发送的命令字符串
+  * @param	ack: 期待的应答结果,如果为空,则表示不需要等待应答
+  * @param	waittime: 等待时间(单位:10ms)
+  * @retval 0: 发送成功(得到了期待的应答结果), 
+  * @retval	1: 发送失败
+  * @note   None
+  */
 char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime)
->>>>>>> updata
 {
 	char res=0; 
 	GSM_USART_RX_STA=0;
@@ -110,15 +81,11 @@ char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime)
 			DELAYClass.DelayMs(10);
 			if(GSM_USART_RX_STA&0X8000)//接收到期待的应答结果
 			{
-<<<<<<< HEAD
-				if(*GSM_check_cmd(ack))
-=======
 				if(GSM_check_cmd(ack) != ((void *)0))
->>>>>>> updata
 				{
 					break; // 得到有效数据 
 				}
-					GSM_USART_RX_STA=0;
+				GSM_USART_RX_STA=0;
 			} 
 		}
 		if(waittime==0)res=1; 
@@ -126,19 +93,11 @@ char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime)
 	return res;
 } 
 /**
-<<<<<<< HEAD
-	* @brief  发送短信
-	* @param  None
-  * @retval None
-  * @note   None
-*/
-void GSM_sendMessage(void)
-=======
   * @brief  string转换int
-	* @param  *str:字符串地址
+  * @param  *str:字符串地址
   * @retval 返回int型
   * @note   None
-*/
+  */
 int stringToInt(char *str)
 {
 	char *p = str;
@@ -152,22 +111,15 @@ int stringToInt(char *str)
 	return nNUM;
 }
 /**
-	* @brief  发送短信
-	* @param  None
+  * @brief  发送短信
+  * @param  None
   * @retval None
-*/
+  */
 void GSM_sendMessage(char *message)
->>>>>>> updata
 {
 	char p[40];
 
 	#ifdef DEBUG_printf
-<<<<<<< HEAD
-	printf("1. AT+CPIN?\n");
-	#endif
-	while(GSM_send_cmd("AT+CPIN?\r\n","OK",100));		// 查询卡状态
-	#ifdef DEBUG_printf
-=======
 	printf("0. AT+CPIN?\n");
 	#endif
 	while(GSM_send_cmd("AT+CPIN?\r\n","OK",100));		// 查询卡状态
@@ -176,22 +128,15 @@ void GSM_sendMessage(char *message)
 	#endif
 	while(GSM_send_cmd("AT+CMGF=1\r\n","OK",100));		// 设置TXT模式
 	#ifdef DEBUG_printf
->>>>>>> updata
 	printf("2. AT+CMGS=\n");
 	#endif
 	sprintf((char*)p,"AT+CMGS=\"%s\"\r\n",GSM_phoneNum); // 设置目标手机号
 	while(GSM_send_cmd(p,">",100));  
 	DELAYClass.DelayMs(50);
 	#ifdef DEBUG_printf
-<<<<<<< HEAD
-	printf("3. %s\n",GSM_message);
-	#endif
-	sprintf((char*)p,"%s\r\n",GSM_message); // 设置发送内容
-=======
 	printf("3. %s\n",message);
 	#endif
 	sprintf((char*)p,"%s\r\n",message); // 设置发送内容
->>>>>>> updata
 	GSM_send_cmd(p,">",100);  
 	DELAYClass.DelayMs(50);
 	#ifdef DEBUG_printf
@@ -199,14 +144,11 @@ void GSM_sendMessage(char *message)
 	#endif
 	USART_SendData(USART2, 0x1A); // 确认发送
 }
-<<<<<<< HEAD
-
-=======
 /**
-	* @brief  等待接收短信
-	* @param  None
+  * @brief  等待接收短信
+  * @param  None
   * @retval 0:无短信,!0:接收到的短信的存放地址
-*/
+  */
 uint8_t GSM_waitMessage(void)
 {
 	// 接收到一次数据了
@@ -234,10 +176,10 @@ uint8_t GSM_waitMessage(void)
 	return 0;
 }
 /**
-	* @brief  查看短信
-	* @param  None
+  * @brief  查看短信
+  * @param  None
   * @retval 返回帧头后的一个字节数据
-*/
+  */
 char GSM_readMessage(uint8_t addrNum)
 {
 	char pp[40];
@@ -285,7 +227,6 @@ char GSM_readMessage(uint8_t addrNum)
 	GSM_USART_RX_STA = 0;
 	return 0;
 }
->>>>>>> updata
 /**
   * @brief  GSM初始化
   * @param  None

+ 3 - 7
module_Template/SIM900A/GSM_func.h

@@ -1,20 +1,16 @@
-#ifndef __WIFI_FUNC_H
-#define __WIFI_FUNC_H
+#ifndef __GSM_FUNC_H
+#define __GSM_FUNC_H
 
 #include "main.h"
 
-<<<<<<< HEAD
-void GSM_clear(void);
-void GSM_sendMessage(void);
-=======
 
 char GSM_send_cmd(char *cmd,char *ack,uint16_t waittime);
 int stringToInt(char *str);
 void GSM_sendMessage(char *message);
 uint8_t GSM_waitMessage(void);
 char GSM_readMessage(uint8_t addrNum);
->>>>>>> updata
 void GSM_Init(void);
+
 #endif
 
 

+ 102 - 0
module_Template/SR04超声波/SR04.c

@@ -0,0 +1,102 @@
+/* include ---------------------------------------------------------*/
+#include "main.h"
+
+
+/* private define -------------------------------------------------*/
+// ECHO
+#define ECHO_GPIO_PORT    				GPIOA			              /* GPIO端口 */
+#define ECHO_GPIO_CLK 	    			RCC_APB2Periph_GPIOA		/* GPIO端口时钟 */
+#define ECHO_GPIO_PIN					GPIO_Pin_8			        /* 连接到SCL时钟线的GPIO */
+#define ECHO_GPIO_TOGGLE		 		ECHO_GPIO_PORT->BSRR = ((ECHO_GPIO_PORT->ODR & ECHO_GPIO_PIN) << 16) | (~ECHO_GPIO_PORT->ODR & ECHO_GPIO_PIN)
+#define ECHO_GPIO_SET			   		ECHO_GPIO_PORT->BSRR = (uint32_t)ECHO_GPIO_PIN // 置1
+#define ECHO_GPIO_RESET		   			ECHO_GPIO_PORT->BSRR = (uint32_t)ECHO_GPIO_PIN<<16 // 置0
+#define ECHO_GPIO_READ					((ECHO_GPIO_PORT->IDR & ECHO_GPIO_PIN) != 0)
+// TRIG
+#define TRIG_GPIO_PORT    				GPIOB			              /* GPIO端口 */
+#define TRIG_GPIO_CLK 	    			RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
+#define TRIG_GPIO_PIN					GPIO_Pin_15			        /* 连接到SCL时钟线的GPIO */
+#define TRIG_GPIO_TOGGLE		 		TRIG_GPIO_PORT->BSRR = ((TRIG_GPIO_PORT->ODR & TRIG_GPIO_PIN) << 16) | (~TRIG_GPIO_PORT->ODR & TRIG_GPIO_PIN)
+#define TRIG_GPIO_SET			   		TRIG_GPIO_PORT->BSRR = (uint32_t)TRIG_GPIO_PIN // 置1
+#define TRIG_GPIO_RESET		   			TRIG_GPIO_PORT->BSRR = (uint32_t)TRIG_GPIO_PIN<<16 // 置0
+#define TRIG_GPIO_READ					((TRIG_GPIO_PORT->IDR & TRIG_GPIO_PIN) != 0)
+
+/* private variables ----------------------------------------------*/
+
+/* private function prototypes ------------------------------------*/
+static void Init(void);
+static uint16_t Read(void);
+
+/* public variables -----------------------------------------------*/
+SR04_t SR04 = 
+{
+	Init,
+	Read
+};
+
+/**
+  * @brief  SR04 Init
+  * @param  None
+  * @retval None
+  * @note   None
+*/
+static void Init(void)
+{
+	GPIO_InitTypeDef GPIO_InitStructer;
+
+	RCC_APB2PeriphClockCmd(TRIG_GPIO_CLK, ENABLE);
+	/*TRIG触发信号*/
+	GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
+	GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
+	GPIO_InitStructer.GPIO_Pin=TRIG_GPIO_PIN;
+	GPIO_Init(TRIG_GPIO_PORT, &GPIO_InitStructer);
+	GPIO_ResetBits(TRIG_GPIO_PORT,TRIG_GPIO_PIN);
+
+	RCC_APB2PeriphClockCmd(ECHO_GPIO_CLK, ENABLE);
+	/*ECOH回响信号*/
+	GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
+	GPIO_InitStructer.GPIO_Pin=ECHO_GPIO_PIN;
+	GPIO_Init(ECHO_GPIO_PORT, &GPIO_InitStructer);
+
+}
+
+/**
+  * @brief  Read IO口控制
+  * @param  None
+  * @retval cm
+  * @note   None
+*/
+static uint16_t Read(void)
+{
+	uint32_t tim_time = 0;
+	uint16_t length = 0;
+
+    TRIG_GPIO_SET;
+    DELAYClass.DelayUs(20);
+    TRIG_GPIO_RESET;
+    //等待返回信号
+    while(ECHO_GPIO_READ == RESET)
+    {
+        tim_time++;
+        DELAYClass.DelayUs(1);
+        if(tim_time >= 10000)
+        {
+            return 10000;
+        }
+    }
+    tim_time = 0;
+    //等待返回信号
+    while(ECHO_GPIO_READ)
+    {
+        tim_time++;
+        DELAYClass.DelayUs(1);
+        if(tim_time >= 10000)
+        {
+            return 10000;
+        }
+    }
+    //关闭定时器
+    length = (tim_time * 0.12)/2;
+
+    return length;
+	
+}

+ 21 - 0
module_Template/SR04超声波/SR04.h

@@ -0,0 +1,21 @@
+#ifndef __SR04_H_
+#define __SR04_H_
+
+
+#include <main.h>
+
+typedef struct
+{
+    void (*Init)(void);
+    uint16_t (*Read)(void);
+}SR04_t;
+
+/* extern variables ------------------------------------------------*/
+extern SR04_t SR04;
+
+/* extern function prototypes --------------------------------------*/
+
+
+
+#endif
+

TEMPAT SAMPAH
module_Template/SR04超声波/SR04超声波接口图.png


+ 29 - 29
module_Template/分时调度系统/TimeScheduleSystem.c

@@ -11,7 +11,7 @@ TSS_t *TSS_head = NULL; // 分时调度系统工作链表头节点
 
 /**
   * @brief  分时调度事件初始化
-	*	@note		加入到初始化中
+  * @note	加入到初始化中
   * @param  TSS: 事件指针
   * @param  targetTicks: 目标计数值 = 事件调度周期 / 调度器周期 例如: 100 = 500ms / 5ms
   * @param  callback: 事件回调函数
@@ -28,7 +28,7 @@ unsigned char TSS_init(TSS_t *TSS, unsigned int targetTicks, void (* callback)(v
 }
 /**
   * @brief  分时调度事件执行(循环)处理的内部方法
-	*	@note		None
+  * @note	None
   * @param  TSS: 事件指针
   * @retval None
   */
@@ -36,13 +36,13 @@ static void TSS_whileHandle(TSS_t *TSS)
 {
     // 分时调度结果是等待中或跳过调度则退出
     if(!TSS->result || TSS->skip) return ;
-		TSS->callback(); // 执行绑定的回调函数
-		TSS->ticks = 0; // 防止因手动切换状态导致的ticks不为0
-		TSS->result = 0; // 切换分时调度结果为等待中
+	TSS->callback(); // 执行绑定的回调函数
+	TSS->ticks = 0; // 防止因手动切换状态导致的ticks不为0
+	TSS->result = 0; // 切换分时调度结果为等待中
 }
 /**
   * @brief  分时调度事件执行(循环)处理
-	*	@note		加入到主循环中
+  * @note	加入到主循环中
   * @param  None
   * @retval None
   */
@@ -55,7 +55,7 @@ void TSS_while(void)
 }
 /**
   * @brief  分时调度事件调度处理的内部方法
-	*	@note		None
+  * @note	None
   * @param  TSS: 事件指针
   * @retval None
   */
@@ -63,16 +63,16 @@ static void TSS_timerHandle(TSS_t *TSS)
 {
     // 分时调度结果是可执行或跳过调度则退出
     if(TSS->result || TSS->skip) return ;
-		TSS->ticks += 1; // 计数自加
-		// 计数大于等于目标计数
-		if(TSS->ticks >= TSS->targetTicks) {
-				TSS->ticks = 0; // 计数清零
-				TSS->result = 1; // 切换分时调度结果为可执行
-		}
+	TSS->ticks += 1; // 计数自加
+	// 计数大于等于目标计数
+	if(TSS->ticks >= TSS->targetTicks) {
+			TSS->ticks = 0; // 计数清零
+			TSS->result = 1; // 切换分时调度结果为可执行
+	}
 }
 /**
   * @brief  分时调度事件调度处理
-	*	@note		加入到调度器中
+  * @note	加入到调度器中
   * @param  None
   * @retval None
   */
@@ -87,7 +87,7 @@ void TSS_timer(void)
 
 /**
   * @brief  分时调度事件挂起处理
-	*	@note		主要用于将事件从工作链表中取下
+  * @note	主要用于将事件从工作链表中取下
   * @param  TSS: 事件指针
   * @retval 0: 挂起成功 1: 事件未初始化/初始化失败 2: 事件不在工作链表中(可能已被挂起)
   */
@@ -117,7 +117,7 @@ unsigned char TSS_pending(TSS_t *TSS)
 }
 /**
   * @brief  分时调度事件启动处理
-	*	@note		主要用于将事件加入到工作链表中
+  * @note	主要用于将事件加入到工作链表中
   * @param  TSS: 事件指针
   * @retval 0: 启动成功 1: 事件未初始化/初始化失败 2: 事件已在工作链表中(可能已被恢复)
   */
@@ -138,7 +138,7 @@ unsigned char TSS_start(TSS_t *TSS)
 
 /**
   * @brief  分时调度事件设置计数值处理
-	*	@note		None
+  * @note	None
   * @param  TSS: 事件指针
   * @param  ticks: 设置的计数值
   * @retval None
@@ -149,7 +149,7 @@ void TSS_setTicks(TSS_t *TSS, unsigned char ticks)
 }
 /**
   * @brief  分时调度事件获取计数值处理
-	*	@note		None
+  * @note	None
   * @param  TSS: 事件指针
   * @retval 事件计数值
   */
@@ -159,7 +159,7 @@ unsigned int TSS_getTicks(TSS_t *TSS)
 }
 /**
   * @brief  分时调度事件设置目标计数值处理
-	*	@note		主要用于修改事件执行周期,若较上次改小则可能立即触发事件执行
+  * @note	主要用于修改事件执行周期,若较上次改小则可能立即触发事件执行
   * @param  TSS: 事件指针
   * @param  result: 设置的目标计数值
   * @retval None
@@ -170,7 +170,7 @@ void TSS_setTargetTicks(TSS_t *TSS, unsigned char targetTicks)
 }
 /**
   * @brief  分时调度事件获取目标计数值处理
-	*	@note		主要用于查看事件执行周期
+  * @note	主要用于查看事件执行周期
   * @param  TSS: 事件指针
   * @retval 事件目标计数值
   */
@@ -180,7 +180,7 @@ unsigned int TSS_TargetTicks(TSS_t *TSS)
 }
 /**
   * @brief  分时调度事件设置结果值处理
-	*	@note		主要用于立即切换事件结果为1:可执行
+  * @note	主要用于立即切换事件结果为1:可执行
   * @param  TSS: 事件指针
   * @param  result: 设置的结果值
   * @retval None
@@ -191,7 +191,7 @@ void TSS_setResult(TSS_t *TSS, unsigned char result)
 }
 /**
   * @brief  分时调度事件获取结果值处理 
-  * @note		一般获取到的事件结果多为0:等待中,因为在事件执行后事件结果值即清零
+  * @note	一般获取到的事件结果多为0:等待中,因为在事件执行后事件结果值即清零
   * @param  TSS: 事件指针
   * @retval 事件结果值 0: 等待中 1: 可执行
   */
@@ -202,7 +202,7 @@ unsigned char TSS_getResult(TSS_t *TSS)
 
 /**
   * @brief  分时调度事件设置状态值处理
-  * @note		手动操作此函数无效,因为事件状态只与事件是否存在于工作链表中有关
+  * @note	手动操作此函数无效,因为事件状态只与事件是否存在于工作链表中有关
   * @param  TSS: 事件指针
   * @param  state: 设置的状态值
   * @retval None
@@ -213,7 +213,7 @@ void TSS_setState(TSS_t *TSS, unsigned char state)
 }
 /**
   * @brief  分时调度事件获取状态值处理
-  * @note		主要用于查看事件是否存在于工作链表中
+  * @note	主要用于查看事件是否存在于工作链表中
   * @param  TSS: 事件指针
   * @retval 事件的状态值 0:不在工作链表 1:在工作链表
   */
@@ -223,9 +223,9 @@ unsigned char TSS_getState(TSS_t *TSS)
 }
 
 /**
-	* @brief  分时调度事件设置跳过值处理 
-  * @note		主要用于事件仍在工作链表中的启动或挂起,相较于把事件从工作链表取下和恢复,此操作更快
-	* @param  TSS: 事件指针
+  * @brief  分时调度事件设置跳过值处理 
+  * @note	主要用于事件仍在工作链表中的启动或挂起,相较于把事件从工作链表取下和恢复,此操作更快
+  * @param  TSS: 事件指针
   * @param  state: 设置的跳过值
   * @retval None
   */
@@ -235,9 +235,9 @@ void TSS_setSkip(TSS_t *TSS, unsigned char skip)
 }
 /**
   * @brief  分时调度事件获取跳过值处理
-	*	@note		主要用于查看事件是否跳过事件调度,事件仍在工作链表中的启动或挂起
+  * @note	主要用于查看事件是否跳过事件调度,事件仍在工作链表中的启动或挂起
   * @param  TSS: 事件指针
-	* @retval 事件的跳过值 0:不跳过调度 1: 跳过调度
+  * @retval 事件的跳过值 0:不跳过调度 1: 跳过调度
   */
 unsigned char TSS_getSkip(TSS_t *TSS)
 {

+ 114 - 0
system_Template/CAN.c

@@ -0,0 +1,114 @@
+#include "can.h"
+#include <string.h>
+
+/**
+  * @brief  CAN配置
+  * @param  
+  * @retval None
+	* @note		tsjw:重新同步跳跃时间单元.范围:1~3;	CAN_SJW_1tq	CAN_SJW_2tq	CAN_SJW_3tq	CAN_SJW_4tq
+			tbs2:时间段2的时间单元.范围:1~8;
+			tbs1:时间段1的时间单元.范围:1~16;	  CAN_BS1_1tq ~CAN_BS1_16tq
+			brp :波特率分频器.范围:1~1024;(实际要加1,也就是1~1024) tq=(brp)*tpclk1
+			注意以上参数任何一个都不能设为0,否则会乱.
+			波特率=Fpclk1/((tsjw+tbs1+tbs2)*brp);
+			mode:0,普通模式;1,回环模式;
+			Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Normal_Init(1,8,7,5,1);
+			则波特率为:36M/((1+8+7)*5)=450Kbps
+  */
+u8 CAN_Mode_Init(u8 tsjw,u8 tbs1,u8 tbs2,u16 brp,u8 mode)
+{
+	GPIO_InitTypeDef GPIO_InitStructure;
+	CAN_InitTypeDef CAN_InitStructure;
+ 	CAN_FilterInitTypeDef CAN_FilterInitStructure;
+	NVIC_InitTypeDef NVIC_InitStructure;
+	
+	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能PORTA时钟                											 
+	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); //使能CAN1时钟
+	// CAN_Tx
+	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
+	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽
+	GPIO_Init(GPIOA, &GPIO_InitStructure);			//初始化IO
+	// CAN_Rx
+	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
+	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	//上拉输入
+	GPIO_Init(GPIOA, &GPIO_InitStructure);			//初始化IO
+	
+	//CAN单元设置 MCR
+ 	CAN_InitStructure.CAN_TTCM=DISABLE;	//非时间触发通信模式  //
+ 	CAN_InitStructure.CAN_ABOM=ENABLE;	//软件自动离线管理	 //
+	CAN_InitStructure.CAN_AWUM=DISABLE;	//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//
+	CAN_InitStructure.CAN_NART=ENABLE;	//禁止报文自动传送 //只发一次,不管成功与否
+	CAN_InitStructure.CAN_RFLM=DISABLE;	//报文不锁定,新的覆盖旧的 // 
+	CAN_InitStructure.CAN_TXFP=DISABLE;	//优先级由报文标识符决定 //
+	//设置CAN1波特率
+	CAN_InitStructure.CAN_Mode= mode;	//模式设置: mode:0,普通模式;1,回环模式; //
+	CAN_InitStructure.CAN_SJW=tsjw;		//重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq	 CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
+	CAN_InitStructure.CAN_BS1=tbs1;	 	//Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq
+	CAN_InitStructure.CAN_BS2=tbs2;		//Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~	CAN_BS2_8tq
+	CAN_InitStructure.CAN_Prescaler=brp;//分频系数(Fdiv)为brp+1	//
+	CAN_Init(CAN1, &CAN_InitStructure);
+	//配置滤波器组0
+	CAN_FilterInitStructure.CAN_FilterNumber=0;	  						//过滤器0 共28组
+	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 		//标志位ID模式 CAN_FilterMode_IdList
+	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; 		//32位 CAN_FilterScale_16bit
+//	CAN_FilterInitStructure.CAN_FilterIdHigh=0x111<<5;							//32位ID //基本ID放入到STID中
+//	CAN_FilterInitStructure.CAN_FilterIdLow=0|CAN_ID_STD;	
+//	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x222<<5;						//32位MASK
+//	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0|CAN_ID_STD;
+	CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;							//32位ID //基本ID放入到STID中
+	CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;	
+	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;						//32位MASK
+	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
+	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;	//过滤器0关联到FIFO0
+	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 				//激活过滤器0
+	CAN_FilterInit(&CAN_FilterInitStructure);							//滤波器初始化
+	
+	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);
+	
+	CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);								//FIFO0消息挂号中断允许
+	return 0;
+}
+u8 canbuff[8];
+//CAN1接收中断服务函数			    
+void USB_LP_CAN1_RX0_IRQHandler(void)
+{
+  CanRxMsg RxMessage;
+	
+  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
+	
+	if(RxMessage.StdId == 0x200)
+	{
+		memcpy(canbuff,RxMessage.Data,8);
+	}
+}
+//len:数据长度(最大为8)				     
+//msg:数据指针,最大为8个字节.
+//返回值:0,成功;
+//		 其他,失败;
+u8 Can_Send_Msg(u32 canid,u8* msg,u8 len)
+{	
+	u8 mbox;
+	u16 i=0;
+	CanTxMsg TxMessage;
+	TxMessage.StdId=canid;			// 标准标识符为0
+	TxMessage.ExtId=0x1012;			// 设置扩展标示符(29位)
+	TxMessage.IDE=CAN_Id_Standard;	// 使用扩展标识符
+	TxMessage.RTR=CAN_RTR_Data;		// 消息类型为数据帧,一帧8位
+	TxMessage.DLC=len;				// 发送两帧信息
+	for(i=0;i<len;i++)
+	TxMessage.Data[i]=msg[i];		// 第一帧信息          
+	mbox= CAN_Transmit(CAN1, &TxMessage);   
+	i=0;
+	while((CAN_TransmitStatus(CAN1, mbox)!=CAN_TxStatus_Ok)&&(i<0XFFF))i++;	//等待发送结束
+	if(i>=0XFFF)return 1;
+	return 0;		
+
+}
+

+ 37 - 0
system_Template/CAN.h

@@ -0,0 +1,37 @@
+#ifndef __CAN_H
+#define __CAN_H
+
+#include "main.h"
+	 
+u8 CAN_Mode_Init(u8 tsjw,u8 tbs1,u8 tbs2,u16 brp,u8 mode);
+u8 Can_Send_Msg(u32 canid,u8* msg,u8 len);
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+