/*-------------------------------------------------------------------------------------- * @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 #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口初始化*/ }