
#define PY32_C
#include "all.h"

//最多10ms sysTick设为10ms重载中断
void DELAY_us(u32 us)//所以此处最大100000
{ 
u32 t;
SysTick->VAL=0;
us=us*8;
t=(8000000/100)-us;
while(SysTick->VAL>t);
}

void myDelay_ms(u32 t)
{
u32 i;
while(t)
	{for(i=0;i<1333;i++);
	t--;	
	}
}

// 1为UART  0为GPIO
void SET_PA2A3_for_UART_or_GPIO(u8 fun)
{
 /*GPIOA配置*/
  LL_GPIO_InitTypeDef GPIO_InitStruct;
 
if(fun)//UART
	{ 
  /*选择2号引脚*/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
  /*选择复用模式*/
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  /*选择输出速度*/
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  /*选择输出模式*/
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  /*选择上拉*/
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  /*复用为USART1功能*/
  GPIO_InitStruct.Alternate = LL_GPIO_AF1_USART1;
  /*GPIOA初始化*/
  LL_GPIO_Init(GPIOA,&GPIO_InitStruct);
    
  /*选择3号引脚*/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
  /*复用为USART1功能*/
  GPIO_InitStruct.Alternate = LL_GPIO_AF1_USART1;
  /*GPIOA初始化*/
  LL_GPIO_Init(GPIOA,&GPIO_InitStruct);
	}
else 
	{
 /*选择2号引脚*/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
  /*选择复用模式*/
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  /*选择输出速度*/
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  /*选择输出模式*/
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  /*选择上拉*/
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  /*GPIOA初始化*/
  LL_GPIO_Init(GPIOA,&GPIO_InitStruct);
    
  /*选择3号引脚*/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
  /*GPIOA初始化*/
  LL_GPIO_Init(GPIOA,&GPIO_InitStruct);

  LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_2|LL_GPIO_PIN_3);  
	}
	  
}

// 1为UART  0为GPIO
void SET_PA13A14_for_UART_or_GPIO(u8 fun)
{
 /*GPIOA配置*/
  LL_GPIO_InitTypeDef GPIO_InitStruct;
 
if(fun)//UART
	{ 
  /*选择X号引脚TX*/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_14;
  /*选择复用模式*/
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  /*选择输出速度*/
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  /*选择输出模式*/
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  /*选择上拉*/
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  /*复用为USART1功能*/
  GPIO_InitStruct.Alternate = LL_GPIO_AF1_USART1;
  /*GPIOA初始化*/
  LL_GPIO_Init(GPIOA,&GPIO_InitStruct);
    
  /*选择X号引脚 RX*/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_13;
  /*复用为USART1功能*/
  GPIO_InitStruct.Alternate = LL_GPIO_AF0_USART1;
  /*GPIOA初始化*/
  LL_GPIO_Init(GPIOA,&GPIO_InitStruct);
	}
else 
	{
 /*选择2号引脚*/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_14;
  /*选择复用模式*/
  GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  /*选择上拉*/
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  /*GPIOA初始化*/
  LL_GPIO_Init(GPIOA,&GPIO_InitStruct);
    
  /*选择3号引脚*/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_13;
  /*GPIOA初始化*/
  LL_GPIO_Init(GPIOA,&GPIO_InitStruct);  
	}
	  
}


//// 1为UART  0为GPIO
void SET_PF1_for_UART_or_GPIO(u8 fun)
{
	 /*GPIOA配置*/
	  LL_GPIO_InitTypeDef GPIO_InitStruct;
if(fun)
	{
	  /*选择2号引脚*/
	  GPIO_InitStruct.Pin = LL_GPIO_PIN_1;
	  /*选择复用模式*/
	  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;//复用
	  /*选择输出速度*/
	  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
	  /*选择输出模式*/
	  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
	  /*选择上拉*/
	  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
	  /*复用为USART1功能*/
	  GPIO_InitStruct.Alternate = LL_GPIO_AF8_USART1;
	  /*GPIOA初始化*/
	  LL_GPIO_Init(GPIOF,&GPIO_InitStruct);

	  GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
	  LL_GPIO_Init(GPIOF,&GPIO_InitStruct);
	}
else 
	{ 
	  /*选择2号引脚*/
	  GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1;
	  /*选择复用模式*/
	  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;//输出
	  /*选择输出速度*/
	  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
	  /*选择输出模式*/
	  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
	  /*选择上拉*/
	  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
	  /*复用为USART1功能*/
	  ///GPIO_InitStruct.Alternate = LL_GPIO_AF8_USART1;
	  /*GPIOA初始化*/
	  LL_GPIO_Init(GPIOF,&GPIO_InitStruct);	
	  
	  GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
	  LL_GPIO_Init(GPIOF,&GPIO_InitStruct);	  
	}
}


/**
  * @brief  USART配置函数.
  * @param  USARTx：USART模块，USART1
  * @retval 无
  */
void APP_ConfigUsart(USART_TypeDef *USARTx)
{
LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_USART1);

  /*设置USART1中断优先级*/
  NVIC_SetPriority(USART1_IRQn,0);
  /*使能USART1中断*/
  NVIC_EnableIRQ(USART1_IRQn);
    
 /*配置USART功能*/
  LL_USART_InitTypeDef USART_InitStruct;
  /*设置波特率*/
  USART_InitStruct.BaudRate = 9600;
  /*设置数据长度*/
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  /*停止位*/
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  /*设置校验位*/
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  /*USART初始化*/
  LL_USART_Init(USARTx, &USART_InitStruct);
  
  /*配置为全双工异步模式*/
  LL_USART_ConfigAsyncMode(USARTx);
  
  /*使能UART模块*/
  LL_USART_Enable(USARTx);

      /*使能接收奇偶校验错误中断*/
	//LL_USART_EnableIT_PE(USARTx);
      /*使能接收错误中断*/
    //LL_USART_EnableIT_ERROR(USARTx);
      /*使能接收数据寄存器非空中断*/
    LL_USART_EnableIT_RXNE(USARTx);
      
}




/*
#define LL_GPIO_MODE_INPUT                 
#define LL_GPIO_MODE_OUTPUT                
#define LL_GPIO_MODE_ALTERNATE             
#define LL_GPIO_MODE_ANALOG                

  *         @arg @ref LL_GPIO_PULL_NO
  *         @arg @ref LL_GPIO_PULL_UP
  *         @arg @ref LL_GPIO_PULL_DOWN
*/
void GPIO_pin_ini(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode,u8 pull_or_outLevel)
{
u8 i;
u32 xpin;
for(i=0;i<16;i++)
	{	
	if((Pin&(1<<i))==0)continue;
	xpin=1<<i;
	LL_GPIO_SetPinMode(GPIOx,xpin,Mode);
	if(Mode==LL_GPIO_MODE_INPUT)
		LL_GPIO_SetPinPull(GPIOx,xpin,pull_or_outLevel);
	else 
		{///LL_GPIO_SetPinOutputType
		LL_GPIO_SetPinOutputType(GPIOx,xpin,LL_GPIO_OUTPUT_PUSHPULL);
		LL_GPIO_SetPinSpeed(GPIOx,xpin,LL_GPIO_SPEED_FREQ_HIGH);
		if(pull_or_outLevel)LL_GPIO_SetOutputPin(GPIOx,xpin);
		else LL_GPIO_ResetOutputPin(GPIOx,xpin);
		}	
	}
}


void GPIO_INI(void)
{
GPIO_pin_ini(GPIOA,GPIOA_INPUT,LL_GPIO_MODE_INPUT,LL_GPIO_PULL_UP);
GPIO_pin_ini(GPIOA,GPIOA_OUTPUT_L,LL_GPIO_MODE_OUTPUT,0);

GPIO_pin_ini(GPIOB,GPIOB_INPUT,LL_GPIO_MODE_INPUT,LL_GPIO_PULL_UP);
GPIO_pin_ini(GPIOB,GPIOB_OUTPUT,LL_GPIO_MODE_OUTPUT,0);

GPIO_pin_ini(GPIOF,GPIOF_INPUT,LL_GPIO_MODE_INPUT,LL_GPIO_PULL_UP);
GPIO_pin_ini(GPIOF,GPIOF_OUTPUT,LL_GPIO_MODE_OUTPUT,0);

}

void RCC_INI(void)
{
  /* 使能时钟 */
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOF);  
  /*使能USART1时钟*/
LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_USART1);
LL_APB1_GRP2_EnableClock(RCC_APBENR2_TIM1EN);

}

//LL_RCC_LSI_Enable();
//LL_RCC_SetLPTIMClockSource(LL_RCC_LPTIM1_CLKSOURCE_LSI);


u8	GET_PIN_LEVEL_AND_FLOAT(GPIO_TypeDef *GPIOx, uint32_t Pin )
{
u32 m;
LL_GPIO_SetPinPull(GPIOx,Pin,LL_GPIO_PULL_UP);
DELAY_us(3);
m=LL_GPIO_ReadInputPort(GPIOx)&Pin?1:0;


LL_GPIO_SetPinPull(GPIOx,Pin,LL_GPIO_PULL_DOWN);
DELAY_us(3);
m<<=1;
m+=LL_GPIO_ReadInputPort(GPIOx)&Pin?1:0;

if(m==3)return pin_high;//强上拉
else if(m==0)return pin_low;
else return pin_float;//float
}


void GPIO_rf_INT_en_or_dis(u8 en)
{
  /* 配置PA0输入模式 */
  LL_GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* 配置EXTI为中断、下降沿触发 */
  LL_EXTI_InitTypeDef EXTI_InitStruct;
  EXTI_InitStruct.Line = LL_EXTI_LINE_1;
  EXTI_InitStruct.LineCommand = (FunctionalState)en;
  EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING;
  LL_EXTI_Init(&EXTI_InitStruct);
  
  /*EXTI选择PB6触发*/
  LL_EXTI_SetEXTISource(LL_EXTI_CONFIG_PORTA,LL_EXTI_CONFIG_LINE0);
  
  /* 使能中断 */
  NVIC_SetPriority(EXTI0_1_IRQn, 0);
   
if(en)
	NVIC_EnableIRQ(EXTI0_1_IRQn);
else 
	NVIC_DisableIRQ(EXTI0_1_IRQn);
}

void GPIO_PIN_keyInt_SET(u8 en)
{
  /* 配置EXTI为中断、下降沿触发 */
  LL_EXTI_InitTypeDef EXTI_InitStruct;
  EXTI_InitStruct.Line = LL_EXTI_LINE_1;//PA1
  EXTI_InitStruct.LineCommand = (FunctionalState)en;
  EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING;
  LL_EXTI_Init(&EXTI_InitStruct);
  
  /*EXTI选择触发*/
  LL_EXTI_SetEXTISource(LL_EXTI_CONFIG_PORTA,LL_EXTI_CONFIG_LINE1);
  
  /* 使能中断 */
  NVIC_SetPriority(EXTI0_1_IRQn, 0);
   
if(en)
	NVIC_EnableIRQ(EXTI0_1_IRQn);
else 
	NVIC_DisableIRQ(EXTI0_1_IRQn);
}




void CHK_UART_rxTIMEOUT(void)
{
if(sUART1.ms10&&--sUART1.ms10==0)
	{sUART1.b_rx_on=1;
	sUART1.rxbuf[sUART1.in]=0;
	}
}

void PUT_UART_BUF(volatile struct _suart_ *pUart,u8 dat,u16 max)
{
if(pUart->b_rx_on==1)return;

pUart->rxbuf[pUart->in]=dat;//*(+pUart->in)=dat;
pUart->ms10=2;

if(++pUart->in>=max)
	{pUart->b_rx_on=1;pUart->ms10=0;
	pUart->rxbuf[pUart->in]=0;//(pUart->rxbuf+pUart->in)=0;	
	}
}

//字母转数字
u8 LATER_TO_NUMBER(u8 d)
{
if(d>='0'&&d<='9')return d&0x0f;
if(d>='A'&&d<='F')return d-'A'+0x0a;
if(d>='a'&&d<='f')return d-'a'+0x0a;
return 0xff;
}
u8 ASC2HEX(u8 asc2_0,u8 asc2_1)
{u8 tem;
asc2_0=LATER_TO_NUMBER(asc2_0);
asc2_1=LATER_TO_NUMBER(asc2_1);
tem=(asc2_0<<4)+asc2_1;
return tem;
}

void READ_UART(void)
{
if(sUART1.b_rx_on==0)return;
DEBUG("\r\nUART1:%s",sUART1.rxbuf);
if(memcmp((const u8*)sUART1.rxbuf,"AT+",3)==0)
	{
	}


sUART1.b_rx_on=0;
sUART1.in=0;
}



/**
  * @brief  iwdg配置
  * @param  无
  * @retval 无
  */
void IWDG_Config(void)
{
  /* 使能LSI */
  LL_RCC_LSI_Enable();
  while (LL_RCC_LSI_IsReady() == 0U) {;}

  /* 使能IWDG */
  LL_IWDG_Enable(IWDG);
  /* 开启写权限 */
  LL_IWDG_EnableWriteAccess(IWDG);
  /* 设置IWDG分频 */
  LL_IWDG_SetPrescaler(IWDG, LL_IWDG_PRESCALER_32); /* T=1MS */
  /* 设置喂狗事件*/
  LL_IWDG_SetReloadCounter(IWDG, 1000); /* 1ms*1000=1s */
  /* IWDG初始化*/
  while (LL_IWDG_IsReady(IWDG) == 0U) {;}
  /*喂狗*/
  LL_IWDG_ReloadCounter(IWDG);
}

