/*
*********************************************************************************************************
*                                       IAR Development Kits
*                                              on the
*
*                                    M451
*
* Filename      : gpio_vcc.c
* Version       : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/

#include  "includes.h"

volatile uint8_t LCD_Disabled = 0;

void Vcc_Init()
{	
	LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

	/* GPIO Ports Clock Enable */
	LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOE);
	LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
	LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH);
	LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
	LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
	LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD);

	// 设置空闲引脚
	GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
	GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;

	// PA.13~14 is JTAG-SW
	GPIO_InitStruct.Pin = LL_GPIO_PIN_4
						  |LL_GPIO_PIN_8|LL_GPIO_PIN_11;
	LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

	GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
	LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

	// PC.14~15 is OSC32
	GPIO_InitStruct.Pin = LL_GPIO_PIN_4|LL_GPIO_PIN_5
						  |LL_GPIO_PIN_13;
	LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

	GPIO_InitStruct.Pin = LL_GPIO_PIN_3
						  |LL_GPIO_PIN_14;
	LL_GPIO_Init(GPIOD, &GPIO_InitStruct);

	GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_2
						  |LL_GPIO_PIN_10;
	LL_GPIO_Init(GPIOE, &GPIO_InitStruct);

	// PH.0~1 is OSC_HSE
	GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
	LL_GPIO_Init(GPIOH, &GPIO_InitStruct);

	// 设置输出引脚
	GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
	GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
	GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
	GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;

	GPIO_InitStruct.Pin = LL_GPIO_PIN_12;
	LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

	GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7;
	LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

	GPIO_InitStruct.Pin = LL_GPIO_PIN_12;
	LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

	GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_4|LL_GPIO_PIN_11;
	LL_GPIO_Init(GPIOD, &GPIO_InitStruct);

	GPIO_InitStruct.Pin = LL_GPIO_PIN_1
						  |LL_GPIO_PIN_9|LL_GPIO_PIN_11;
	LL_GPIO_Init(GPIOE, &GPIO_InitStruct);

	// 设置开关的默认状态
	VCC_GSM_OFF();
	VCC_GPS_OFF();
	VCC_RS485_OFF();
	VCC_RF_OFF();
	VCC_BD_OFF();
	VCC_SFLASH_FRAM_ON();
	VCC_SENSOR_5V_OFF();
	
	KZ_CHARGE_ENABLE_LOW();
	// 上电先关闭电磁阀
	KZ_CHARGE_DISABLE_HIGH();
	Charge_Pulse_Time = GetDelayTick(1000);
	
	KZ_ALARM_OFF();ALARM_OFF();
	KZ_LOW_ALARM_OFF();
	KZ_LOW_LEVEL_OFF();
	KZ_LEVEL_OFF();
}

// 禁止引脚输出
void Vcc_Disable()
{
	// 把除了LCD、按键、加速度中断、充电检测、控制开关以外的外设引脚设为模拟输入		
	LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
	GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
	
	// PA.12 is VCC_GSM
	// PA.13~14 is JTAG-SW
	GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_3
						|LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7
						|LL_GPIO_PIN_8|LL_GPIO_PIN_9|LL_GPIO_PIN_10|LL_GPIO_PIN_11
						|LL_GPIO_PIN_15;
	LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

	// PB.6 is KZ_CHARGE_ENABLE
	// PB.7 is KZ_CHARGE_DISABLE
	// PB.8~9 is lcd (scl, sda)
	// PB.12 is accelero-cs
	// PB.13~15 is accelero-spi
	GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_3
						|LL_GPIO_PIN_4|LL_GPIO_PIN_5
						|LL_GPIO_PIN_10|LL_GPIO_PIN_11;
	LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

	// PC.7~9 is MA-CS
	// PC.12 is VCC_RS485
	// PC.14~15 is OSC32
	GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_3
						|LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6
						|LL_GPIO_PIN_10|LL_GPIO_PIN_11
						|LL_GPIO_PIN_13;
	LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

	// PD.0 is KZ_LOW_LEVEL
	// PD.1 is KZ_LEVEL
	// PD.2 is VCC_BD
	// PD.4 is VCC_GPS
	// PD.10 is accelero-int
	// PD.11 is VCC_RF
	GPIO_InitStruct.Pin = LL_GPIO_PIN_3
						|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7 
						|LL_GPIO_PIN_8|LL_GPIO_PIN_9
						|LL_GPIO_PIN_12|LL_GPIO_PIN_13|LL_GPIO_PIN_14|LL_GPIO_PIN_15;
	LL_GPIO_Init(GPIOD, &GPIO_InitStruct);

	// PE.1 is VCC_SENSOR_5V
	// PE.3~6 is keys
	// PE.7 is ex-power
	// PE.8 is leak_in
	// PE.9 is KZ_ALARM
	// PE.11 is VCC_SFLASH_FRAM
	GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_2
						|LL_GPIO_PIN_10
						|LL_GPIO_PIN_12|LL_GPIO_PIN_13|LL_GPIO_PIN_14|LL_GPIO_PIN_15;
	LL_GPIO_Init(GPIOE, &GPIO_InitStruct);

	// PB.13~15 is accelero-spi
	GPIO_InitStruct.Pin = LL_GPIO_PIN_13|LL_GPIO_PIN_14|LL_GPIO_PIN_15;
	GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
	GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
	GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
	GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
	LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
	LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_13|LL_GPIO_PIN_14|LL_GPIO_PIN_15);
}

// 恢复通信引脚输出
void Vcc_Enable()
{
	Console_Init();
	SFlash_Init();
	FRAM_Init();
	DAC7311_Init();
	Wakeup_Init();
	if(RF_initStatus)
		RF_Init();
	else
	{
//		BD_Init();	
		Slave_Init();
	}
	Sensor_Init();	
	Accelero_Init();
	Sample_Init();
//	Sample_ReOpen(); // 休眠唤醒以后需重新执行该函数
	Battery_Init();
	DTU_Init();
	Key_Init();
	LCD_Init();

	// 恢复外设引脚
	VCC_SFLASH_FRAM_ON();
	// 控制电流输出开关
	DAC7311_Open();
}
