/*--------------------------------------------------------------------------------------
*  @file     Driver.c
*  @author   ZhangJing
*  @version  base on stm32f0x   
*  @date     2015.09.11
*  @brief    硬件驱动
---------------------------------------------------------------------------------------*/

#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_dma.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_pwr.h"
#include "stm32f10x_rtc.h"
#include "stm32f10x_bkp.h"
#include "TypeDefine.h"
#include "TimerSetup.h"
#include "IICSetup.h"
#include "IIC2Setup.h"
#include "ADS1110Setup.h"
#include "ADS1110ASetup.h"
#include "ADCSetup.h"
#include "SPISetup.h"
#include "USARTSetup.h"
#include "RTCSetup.h"
#include "HostSlaveHandle.h"
#include "Driver.h"
#include "lorawan.h"
#include <stdio.h>
#include "Bubble_ADCSetup.h"
#include "delay.h"
#include "ControlSystem.h"

extern uint8_t Recive_lorawanID_flag;  //接收LORAWAN ID号
uint8_t mcu_id[8];                      //mcu ID号缓冲区
extern uint16_t random_cont;                //随机数种子值


/*************************************************************************************
*  Function:	DriverSpeakerInit						                                                           
*  Object:		Configures SPEAKER GPIO.
*  输入:			无
*  输出:			无	                                     
*  备注:			PB14             
**************************************************************************************/
void DriverSpeakerInit( void )
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
  GPIO_InitTypeDef  GPIO_InitStructure;
  
  /* Enable the GPIO_SPEAKER Clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	/*选择要控制的GPIOC引脚*/															   
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;

	/*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

	/*设置引脚速率为50MHz */   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*调用库函数，初始化GPIOB*/
	GPIO_Init(GPIOB, &GPIO_InitStructure);		  

	/* 关闭锋鸣器	*/
// 	GPIO_ResetBits(GPIOB,GPIO_Pin_14);		
}

/*************************************************************************************
*  Function:	DriverLCDPWRInit						                                                           
*  Object:		Configures LCD Power GPIO.
*  输入:			无
*  输出:			无	                                     
*  备注:			PB6            
**************************************************************************************/
void DriverLCDPWRInit( void )
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
  GPIO_InitTypeDef  GPIO_InitStructure;
  
  /* Enable the GPIO_SPEAKER Clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	/*选择要控制的GPIOC引脚*/															   
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;

	/*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

	/*设置引脚速率为50MHz */   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*调用库函数，初始化GPIOB*/
	GPIO_Init(GPIOB, &GPIO_InitStructure);		  

	/* 主机关闭LCD电源	*/
	GPIO_SetBits(GPIOB,GPIO_Pin_6);		
	
	/* Enable the GPIO_SPEAKER Clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	/*选择要控制的GPIOC引脚*/															   
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;

	/*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

	/*设置引脚速率为50MHz */   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*调用库函数，初始化GPIOB*/
	GPIO_Init(GPIOA, &GPIO_InitStructure);		  

	/* 主机关闭LCD电源	*/
// 	GPIO_SetBits(GPIOA,GPIO_Pin_11);	
}

/*************************************************************************************
*  Function:	DriverZigbeePWRInit						                                                           
*  Object:		Configures Zigbee PWR GPIO.
*  输入:			无
*  输出:			无	                                     
*  备注:			PB12             
**************************************************************************************/
void DriverZigbeePWRInit( void )
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
  GPIO_InitTypeDef  GPIO_InitStructure;
  
  /* Enable the GPIO_SPEAKER Clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	/*选择要控制的GPIOC引脚*/															   
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12;

	/*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

	/*设置引脚速率为50MHz */   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*调用库函数，初始化GPIOB*/
	GPIO_Init(GPIOB, &GPIO_InitStructure);		  

	/* 主机关闭zigbee电源	*/
	//GPIO_SetBits(GPIOB,GPIO_Pin_12);	
	//开电源
	GPIO_ResetBits(GPIOB,GPIO_Pin_12);	
	
	/* 将控制zigbee板的电源引脚设置为悬空	*/
/*	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;						
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOC, &GPIO_InitStructure);*/

// /* Enable the GPIO_SPEAKER Clock */
// 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 	
// 	/*选择要控制的GPIOC引脚*/															   
// 	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 | GPIO_Pin_3;

// 	/*设置引脚模式为通用推挽输出*/
// 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 

// 	/*调用库函数，初始化GPIOB*/
// 	GPIO_Init(GPIOA, &GPIO_InitStructure);		  
}

/*************************************************************************************
*  Function:	DriverKeyInit						                                                           
*  Object:		Configures KEY GPIO.
*							初始化按键，包括中断
*  输入:			无
*  输出:			无	                                     
*  备注:			PE8 PE9  PE10 PE11 PE12 PE13 PE14 PE15   
							EXTI9_5_IRQn、EXTI15_10_IRQn要分开初始化
**************************************************************************************/
void DriverKeyInit( void )
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
  GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
  
  /* Enable the GPIO_KEY Clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
	
	/* Configyre P[A|B|C|D|E]0  NIVC  */
	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);	
	
	/* Configyre P[A|B|C|D|E]0  NIVC  */
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);	
	
	/* 选择要控制的GPIOE引脚,IO配置 PE8/PE9/PE10/PE11/PE12/PE13/PE14/PE15 下拉输入 */															   
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
																| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;																
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	/* 选择要控制的GPIOB引脚,IO配置 PB15 下拉输入 */															   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;																
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	/*外部中断模式设置 EXTI line(PB15) mode config */
//	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource15);
//	EXTI_InitStructure.EXTI_Line = EXTI_Line15;
//	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
//	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
//	EXTI_Init(&EXTI_InitStructure);	
	
	/*外部中断模式设置 EXTI line(PE8) mode config */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource8);
	EXTI_InitStructure.EXTI_Line = EXTI_Line8;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);	
	
	/*外部中断模式设置 EXTI line(PE9) mode config */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource9);
	EXTI_InitStructure.EXTI_Line = EXTI_Line9;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);	
	
	/*外部中断模式设置 EXTI line(PE10) mode config */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource10);
	EXTI_InitStructure.EXTI_Line = EXTI_Line10;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
	/*外部中断模式设置 EXTI line(PE11) mode config */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource11);
	EXTI_InitStructure.EXTI_Line = EXTI_Line11;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);	
	
	/*外部中断模式设置 EXTI line(PE12) mode config */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource12);
	EXTI_InitStructure.EXTI_Line = EXTI_Line12;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);	
	
	/*外部中断模式设置 EXTI line(PE13) mode config */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource13);
	EXTI_InitStructure.EXTI_Line = EXTI_Line13;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);	
	
	/*外部中断模式设置 EXTI line(PE14) mode config */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource14);
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);	
	
	/*外部中断模式设置 EXTI line(PE15) mode config */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource15);
	EXTI_InitStructure.EXTI_Line = EXTI_Line15;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);	
}

/*************************************************************************************
*  Function:	PowerKeySave						                                                           
*  Object:		Configures POWER GPIO Save Mode.
*							仅配置了电源控制引脚完全关闭
*  输入:			无
*  输出:			无	                                     
*  备注:			PE15             
**************************************************************************************/
void PowerKeySave( void )
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
  GPIO_InitTypeDef GPIO_InitStructure;
	
	/* 选择要控制的GPIOA引脚,IO配置 PE9/PE10/PE11/PE12/PE13/PE14/PE8 下拉输入 */															   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;																
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
}

/*************************************************************************************
*  Function:	DriverMotorInit						                                                           
*  Object:		Configures MOTOR GPIO.
*							仅配置了电机控制引脚
*  输入:			无
*  输出:			无	                                     
*  备注:			PB13             
**************************************************************************************/
void DriverMotorInit( void )
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
  GPIO_InitTypeDef  GPIO_InitStructure;
  
	//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1,ENABLE);
  /* 启动GPIO */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	/* 启动AFIO */
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
	/* 启动TIM1 */
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); 
	
	/* PB.13口设置为TIM1_CH1N */													   
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13;

	/*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP; 

	/*设置引脚速率为50MHz */   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*调用库函数，初始化GPIOB*/
	GPIO_Init(GPIOB, &GPIO_InitStructure);	
	
	/* 关闭电机	*/
// 	GPIO_SetBits(GPIOB,GPIO_Pin_13);
}

/*************************************************************************************
*  Function:	DriverHallInit						                                                           
*  Object:		Configures Hall GPIO.
*  输入:			无
*  输出:			无	                                     
*  备注:			PA1/PA6            
**************************************************************************************/
void DriverHallInit( void )
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
  GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
  
  /* Enable the GPIO_KEY Clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
	
	/* Configyre P[A|B|C|D|E]0  NIVC  */
	/*NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);	*/
	
	/* Configyre P[A|B|C|D|E]0  NIVC  */
	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;// 1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);	
	
	/* 选择要控制的GPIOE引脚,IO配置 PA1/PA6 上拉输入 */															   
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;					
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_IPD
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;					
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_Out_PP
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	
	/*外部中断模式设置 EXTI line(PA1) mode config */
	/*GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
	EXTI_InitStructure.EXTI_Line = EXTI_Line1;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);	*/
	
	/*外部中断模式设置 EXTI line(PA6) mode config */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);
	EXTI_InitStructure.EXTI_Line = EXTI_Line6;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
}

/*************************************************************************************
*  Function:	DriverSavePinInit						                                                           
*  Object:		配置除电源控制键外所有用的引脚全部不可用，用来做节能模式					
*  输入:			无
*  输出:			无	                                     
*  备注:			PE15电源键 PE9/10/11/12/13/14/15             
**************************************************************************************/
void DriverSavePinInit( void )
{
//	/*定义一个GPIO_InitTypeDef类型的结构体*/
//  GPIO_InitTypeDef GPIO_InitStructure;

//	/* 选择要控制的GPIOA引脚,IO配置成低功耗模式 */															   
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 
//															| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 
//															| GPIO_Pin_8 | GPIO_Pin_9	| GPIO_Pin_10 | GPIO_Pin_11 
//															| GPIO_Pin_12 | GPIO_Pin_13	| GPIO_Pin_14 | GPIO_Pin_15 ;																
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
//	GPIO_Init(GPIOA, &GPIO_InitStructure);
//	
//	/* 选择要控制的GPIOB引脚,IO配置成低功耗模式 */															   
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 
//															| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 
//															| GPIO_Pin_8 | GPIO_Pin_9	| GPIO_Pin_10 | GPIO_Pin_11 
//															| GPIO_Pin_12 | GPIO_Pin_13	| GPIO_Pin_14 | GPIO_Pin_15 ;																
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
//	GPIO_Init(GPIOB, &GPIO_InitStructure);
//	
//	/* 选择要控制的GPIOC引脚,IO配置成低功耗模式 */															   
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 
//															| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 
//															| GPIO_Pin_8 | GPIO_Pin_9	| GPIO_Pin_10 | GPIO_Pin_11 
//															| GPIO_Pin_12 | GPIO_Pin_13	| GPIO_Pin_14 | GPIO_Pin_15 ;																
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
//	GPIO_Init(GPIOC, &GPIO_InitStructure);
//	
//	/* 选择要控制的GPIOD引脚,IO配置成低功耗模式 */															   
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 
//															| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 
//															| GPIO_Pin_8 | GPIO_Pin_9	| GPIO_Pin_10 | GPIO_Pin_11 
//															| GPIO_Pin_12 | GPIO_Pin_13	| GPIO_Pin_14 | GPIO_Pin_15 ;																
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
//	GPIO_Init(GPIOD, &GPIO_InitStructure);
//	
//	/* 选择要控制的GPIOE引脚,IO配置成低功耗模式 */															   
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 
//															| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 
//															| GPIO_Pin_8 | GPIO_Pin_9	| GPIO_Pin_10 | GPIO_Pin_11 
//															| GPIO_Pin_12 | GPIO_Pin_13	| GPIO_Pin_14 | GPIO_Pin_15 ;																
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
//	GPIO_Init(GPIOE, &GPIO_InitStructure);
}

/*********************************************************************************
*  Function:	SpeakerCtl						                                                           
*  Object:		蜂鸣器控制
*  输入:			蜂鸣器控制状态
*  输出:			无	                                     
*  备注:			uint8_t driverState:DRIVER_ON蜂鸣器打开，DRIVER_OFF蜂鸣器关闭               
**********************************************************************************/
void SpeakerCtl( uint8_t driverState )
{
	if( driverState == DRIVER_ON )
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_14);
	}
	else
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_14);
	}
}

/*********************************************************************************
*  Function:	SensorPWRCtl						                                                           
*  Object:		Sensor电源控制
*  输入:			Sensor控制状态
*  输出:			无	                                     
*  备注:			uint8_t driverState：DRIVER_ON传感器电源打开;DRIVER_OFF传感器电源关闭              
**********************************************************************************/
void SensorPWRCtl( uint8_t driverState )
{
	if( driverState == DRIVER_ON )
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_6);		//打开红外检测传感器电源
		GPIO_SetBits(GPIOA,GPIO_Pin_1);     //使能红外检测传感器
	}
	else
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_6);
		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	}
}

/********************************************************************************************************
*  Function:	Power_GPIOInit						                                                           
*  Object:		单片机引动初始化
*  输入:			无
*  输出:			无	                                     
*  备注:			PA8电机电路电源芯片使能脚
              PD5主控电源控制管脚
********************************************************************************************************/
void Power_GPIOInit(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
  
  /* Enable the GPIOA/GPIOB Clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
	
	/* Configure the GPIO_MainPOWER pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);	
	/* 打开总电源（MCU 电源）	*/
	GPIO_ResetBits(GPIOD,GPIO_Pin_5);

  /* Configure the GPIO_ENMotorPower pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);	
	/* 使能电源芯片 TPS73633DBVT	*/
	GPIO_SetBits(GPIOA,GPIO_Pin_8);		

}
/********************************************************************************************************
*  Function:	Power_GPIOInit						                                                           
*  Object:		LED指示灯初始化
*  输入:			无
*  输出:			无	                                     
*  备注:			PB1 GREEN LED
              PB8 RED LED
              PB9 YELLOW LED
********************************************************************************************************/
void LedInit(void)
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
  GPIO_InitTypeDef  GPIO_InitStructure;  
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);												   
	GPIO_InitStructure.GPIO_Pin =  (GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9) ;

	/*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP; 

	/*设置引脚速率为50MHz */   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*调用库函数，初始化GPIOB*/
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_1);
	
}
/********************************************************************************************************
*  Function:	WatchDogInit						                                                           
*  Object:		看门狗初始化
*  输入:			无
*  输出:			无	                                     
*  备注:			PC0 WDI
              PC1 WDT-EN
********************************************************************************************************/
void WatchDogInit(void)
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
	GPIO_InitTypeDef  GPIO_InitStructure;  
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);												   
	GPIO_InitStructure.GPIO_Pin =  (GPIO_Pin_0 | GPIO_Pin_1) ;

	/*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP; 

	/*设置引脚速率为50MHz */   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*调用库函数，初始化GPIOB*/
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
//	GPIO_ResetBits(GPIOC,GPIO_Pin_1); //开启看门狗
}
/*********************************************************************************
*  Function:	LCDBLACtl						                                                           
*  Object:		LCD背光控制
*  输入:			LCD背光控制状态
*  输出:			无	                                     
*  备注:			uint8_t driverState：DRIVER_ON背光电源打开;DRIVER_OFF背光电源关闭              
**********************************************************************************/
void LCDBLACtl( uint8_t driverState )
{	
	if( driverState == DRIVER_ON )
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_11);
	}
	else
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_11);	
	}
}

/*********************************************************************************
*  Function:	ZigbeePWRCtl						                                                           
*  Object:		zigbee电源控制
*  输入:			zigbee电源控制状态
*  输出:			无	                                     
*  备注:			uint8_t driverState：DRIVER_ON zigbee电源打开，DRIVER_OFF zigbee电源关闭              
**********************************************************************************/
void ZigbeePWRCtl( uint8_t driverState )
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
 // GPIO_InitTypeDef GPIO_InitStructure;

	if( driverState == DRIVER_ON )
	{
		/* 重新初始化一下通信口 */
	//	USART2_Init( 9600 );
		GPIO_ResetBits(GPIOB,GPIO_Pin_12);		
	}
/*	else
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_12);

		// 将zigbee通信口设置为低功耗模式 									   
		GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 | GPIO_Pin_3;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 
		GPIO_Init(GPIOA, &GPIO_InitStructure);	
	}*/
}

/*********************************************************************************
*  Function:	MotorPWRCtl						                                                           
*  Object:		Motor电源控制
*  输入:			Motor电源控制状态
*  输出:			无	                                     
*  备注:			uint8_t driverState： DRIVER_ON电机电源打开，DRIVER_OFF电机电源关闭             
**********************************************************************************/
void MotorPWRCtl( uint8_t driverState )
{
	if( driverState == DRIVER_ON )
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_13);		
	}
	else
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_13);
	}
}
/*********************************************************************************
*  Function:	SpeakerInit						                                                           
*  Object:		功放管脚初始化
*  输入:			五
*  输出:			无	                                     
*  备注:			data PC10.BUSY PC9           
**********************************************************************************/
void SpeakerInit(void)
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
	GPIO_InitTypeDef  GPIO_InitStructure;  
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);												   
	GPIO_InitStructure.GPIO_Pin =  (GPIO_Pin_15 ) ;

	/*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_AF_PP;   
	
	GPIO_InitStructure.GPIO_Pin =  ( GPIO_Pin_12) ;

	/*设置引脚模式为通用推挽输出*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP; 

	/*设置引脚速率为50MHz */   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*调用库函数，初始化GPIOB*/
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA, GPIO_Pin_12);
	Delay_ms(120);
	HornWorkStatus(HornMaxSound);//初始化最大音量
	Delay_ms(5);
}

/*********************************************************************************
*  Function:	SpeakerResetInit						                                                           
*  Object:		功放管脚复位
*  输入:			五
*  输出:			无	                                     
*  备注:			data PC10.BUSY PC9 设置成浮空输入          
**********************************************************************************/
void SpeakerResetInit(void)
{
	/*定义一个GPIO_InitTypeDef类型的结构体*/
	GPIO_InitTypeDef  GPIO_InitStructure;  
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);												   
	GPIO_InitStructure.GPIO_Pin =  (GPIO_Pin_15) ;

	/*设置引脚模式为浮空输入*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
	
	GPIO_InitStructure.GPIO_Pin =  ( GPIO_Pin_12) ;

	/*设置引脚模式为浮空输入*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

	/*调用库函数，初始化GPIOB*/
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*************************************************************************************
*  Function:	CntAlarmSpeaker			                                                           
*  Object:		控制喇叭工作
*  输入:			uint16_t pwmSetValue
*  输出:			无	                                     
*  备注:			pwmSetValue 0：停止工作 其它值：开启电机             
**************************************************************************************/
void CntAlarmSpeaker(uint8_t AlarmData)
{
	uint8_t S_DATA,j;
	uint8_t B_DATA;
	S_DATA = AlarmData;
	SpeakerDataGPIOLow;
	Delay_ms(5);          //延时 5ms
	B_DATA = S_DATA&0X01;
	for(j=0;j<8;j++)
	{
		if(B_DATA == 1)
		{
			SpeakerDataGPIOHight;
			delay_us(6);   //延时 600us
			SpeakerDataGPIOLow;
			delay_us(2);    //延时 200us
		}
		else
		{
			SpeakerDataGPIOHight;
			delay_us(2);       //延时 200us
			SpeakerDataGPIOLow;
			delay_us(6);      //延时 600us
		}
		S_DATA = S_DATA>>1;
		B_DATA = S_DATA&0X01;
	}
	SpeakerDataGPIOHight;
}
/*************************************************************************************
*  Function:	CntOpenHornInit			                                                           
*  Object:		控制打开喇叭管脚初始化
*  输入:			
*  输出:			无	                                     
*  备注:			         
**************************************************************************************/
void CntOpenHornInit()
{
	if((SysHornToneType != SoundWate)&&(TaskSchedulerFlag.AlarmInitFlag == TASK_FLAG_CLEAR))
	{
//		TIM3_Int_Init(100-1,800-1);
		SpeakerInit();//喇叭初始化
		TaskSchedulerFlag.AlarmInitFlag = TASK_FLAG_SET;//报警管脚初始化完成标志
	}
	else if((SysHornToneType == SoundWate)&&(TaskSchedulerFlag.AlarmInitFlag == TASK_FLAG_SET))
	{
		TaskSchedulerFlag.AlarmInitFlag = TASK_FLAG_CLEAR;
		SpeakerResetInit();//喇叭管脚复位
	}
}

/*********************************************************************************
*  Function:	MCU_ID						                                                           
*  Object:		ID读取
*  输入:			无
*  输出:			无	                                     
*  备注:			96位ID，12个字节，低6位求和整理为2个字节             
**********************************************************************************/
void MCU_ID( void )
{
	u32 mcuID[3];
	u32 check_id=0;
	
	  //--------------读取mcu ID号------------------
    mcuID[0] = *(__IO u32*)(0x1FFFF7E8);
    mcuID[1] = *(__IO u32*)(0X1FFFF7EC);
    mcuID[2] = *(__IO u32*)(0x1FFFF7F0);	
		
		check_id = (uint32_t)((uint8_t)mcuID[0]+(uint8_t)(mcuID[0]>>8)+(uint8_t)(mcuID[0]>>16)+(uint8_t)(mcuID[0]>>24)+(uint8_t)mcuID[1]+(uint8_t)(mcuID[1]>>8));
		
		mcu_id[7] = (uint8_t)check_id;
	  mcu_id[6] = (uint8_t)(check_id>>8); //低位
	  mcu_id[5] = (uint8_t)(mcuID[1]>>16);
	  mcu_id[4] = (uint8_t)(mcuID[1]>>24);
	
	  mcu_id[3] = (uint8_t)mcuID[2];
	  mcu_id[2] = (uint8_t)(mcuID[2]>>8);
	  mcu_id[1] = (uint8_t)(mcuID[2]>>16);
	  mcu_id[0] = (uint8_t)(mcuID[2]>>24); //高位
	
	  random_cont=(uint16_t)(mcuID[0]+mcuID[1]+mcuID[2]);
		
	  Recive_lorawanID_flag=1;
/*	  printf("%x\r\n",mcuID[0]);
	  printf("%x\r\n",mcuID[1]);
	  printf("%x\r\n",mcuID[2]);*/		

}

/*********************************************************************************
*  Function:	HWSetup						                                                           
*  Object:		硬件初始化
*  输入:			无
*  输出:			无	                                     
*  备注:			SystemCoreClock：((uint32_t)8000000) !< Value of the External oscillator in Hz              
**********************************************************************************/
void HWSetup( void )
{
	SystemInit();	
	/* Setup SysTick Timer for 1 msec interrupts  */
	SysTick_Config(SystemCoreClock / 1000);

	DriverMotorInit();
	
	DriverHallInit();
	
	DriverSpeakerInit();
	DriverLCDPWRInit();
	DriverZigbeePWRInit();
 	DriverKeyInit();
	LedInit();
	
	Power_GPIOInit();
	                                          
	USART1_Init(115200);
	USART2_Init(115200); // update by wulianwei
	//USART3_Init(9600);
	SPIInit();
	
	IICInit();
	//IIC2Init();
	ADS1110Config();	
	//ADS1110AConfig();	
	//LoraNode_GPIO_Init(); //comment by wulianwei
	//--------------------------- OPEN DMA CLK -------------------------
	//开DMA时钟 用于ADC模式	
	//DriverADCInit();	
	OPB350L_ADCInit();//红外检测气泡传感器初始化	

	//板端电源设置-关闭
	MotorPWRCtl( DRIVER_OFF );
	SpeakerCtl( DRIVER_OFF );//蜂鸣器
	TIM3_Int_Init(100-1,800-1);
//	SpeakerInit();//喇叭初始化
	SensorPWRCtl( DRIVER_ON );//Sensor电源
	LCDBLACtl( DRIVER_OFF );//LCD背光
 //	ZigbeePWRCtl( DRIVER_ON );//zigbee电源 
	MCU_ID();//读取mcu的ID号
	WatchDogInit();//看门狗IO口初始化*/
}

