/**
  ******************************************************************************
  * @file    main.c
  * @author  MCU Application Team
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) Puya Semiconductor Co.
  * All rights reserved.</center></h2>
  *
  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "all.h"





/* Private function prototypes -----------------------------------------------*/
void APP_SystemClockConfig(void);
void APP_ConfigUsart(USART_TypeDef *USARTx);

	
int fputc(int c, FILE * stream) 
{WDTC();
LL_USART_TransmitData8(USART1, c);
while(LL_USART_IsActiveFlag_TC(USART1) == RESET);
return  0;
}



/**
  * @brief  USART中断处理函数.
  * @param  USARTx：USART模块，USART1
  * @retval 无
  */
void APP_UsartIRQCallback(USART_TypeDef *USARTx)
{
    /* 接收数据寄存器不为空 */
    uint32_t errorflags = (LL_USART_IsActiveFlag_PE(USARTx) | LL_USART_IsActiveFlag_FE(USARTx) |\
                           LL_USART_IsActiveFlag_ORE(USARTx) | LL_USART_IsActiveFlag_NE(USARTx));
if (errorflags == RESET)
    {
        if ((LL_USART_IsActiveFlag_RXNE(USARTx) != RESET) && (LL_USART_IsEnabledIT_RXNE(USARTx) != RESET))
        {
        PUT_UART_BUF(&sUART1,LL_USART_ReceiveData8(USARTx),max_rx1_len);
        
        }
    }
    
    /* 接收错误 */ 
if (errorflags != RESET)
    {
    LL_USART_ReceiveData8(USARTx);//通过读DR可以清除此中断
    //  Error_Handler();
    }
#if 0    
    /* 发送数据寄存器空 */ 
if ((LL_USART_IsActiveFlag_TXE(USARTx) != RESET) && (LL_USART_IsEnabledIT_TXE(USARTx) != RESET))
      {
        LL_USART_TransmitData8(USARTx, *TxBuff);
        TxBuff++;
        if (--TxCount == 0U)
        { 
            LL_USART_DisableIT_TXE(USARTx);
            
            LL_USART_EnableIT_TC(USARTx);
        }
        return;
    }
    
    /* 发送完成 */
if ((LL_USART_IsActiveFlag_TC(USARTx) != RESET) && (LL_USART_IsEnabledIT_TC(USARTx) != RESET))
    {
        LL_USART_DisableIT_TC(USARTx);
        UartReady = SET;
      
        return;
    }
#endif
    
}

/************************ (C) COPYRIGHT Puya *****END OF FILE****/

void APP_ConfigTIM1(void)
{
  /*配置TIM1*/
  LL_TIM_InitTypeDef TIM1CountInit = {0};
  
  TIM1CountInit.ClockDivision       = LL_TIM_CLOCKDIVISION_DIV1;/* 不分频             */
  TIM1CountInit.CounterMode         = LL_TIM_COUNTERMODE_UP;    /* 计数模式：向上计数 */
//  TIM1CountInit.Prescaler           = 8000-1;                   /* 时钟预分频：8000  1ms */
  TIM1CountInit.Prescaler           = 8-1;                   /* 时钟预分频：8  1us */
  TIM1CountInit.Autoreload          = 50000-1;//1000-1;                   /* 自动重装载值：1000 */
  TIM1CountInit.RepetitionCounter   = 0;                        /* 重复计数值：0      */
  
  /*初始化TIM1*/
  LL_TIM_Init(TIM1,&TIM1CountInit);

  /*清除更新标志位*/
  LL_TIM_ClearFlag_UPDATE(TIM1);
  
  /*使能自动重载预装载*/
  LL_TIM_EnableARRPreload(TIM1);
  
  /*使能UPDATE中断*/
  LL_TIM_EnableIT_UPDATE(TIM1);
  
  /*使能TIM1计数器*/
  LL_TIM_EnableCounter(TIM1);
  
  /*开启UPDATE中断请求*/
  NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
  NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn,0);
}
/**
  * @brief  TIM更新中断回调函数
  * @param  无
  * @retval 无
  */
void APP_UpdateCallback(void)
{
  /*设置重载值为500*/
  //LL_TIM_SetAutoReload(TIM1,50000-1);
  
SYS.b_50ms=1;
}



void LPpin_PA4_extiINT_SET(u8 en)
{
  /* 配置EXTI为中断、下降沿触发 */
  LL_EXTI_InitTypeDef EXTI_InitStruct;
  EXTI_InitStruct.Line = LL_EXTI_LINE_4;//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_LINE4);
  
  /* 使能中断 */
  NVIC_SetPriority(EXTI4_15_IRQn, 0);
   
if(en)
	NVIC_EnableIRQ(EXTI4_15_IRQn);
else 
	NVIC_DisableIRQ(EXTI4_15_IRQn);
}
/**
  * @brief  配置LPTIM单次模式
  * @param  无
  * @retval 无
  */
static void APP_ConfigLPTIM_OneShot(void)
{
  /*配置LPTIM*/
  /*LPTIM预分频器64分频    */
  LL_LPTIM_SetPrescaler(LPTIM1,LL_LPTIM_PRESCALER_DIV64);
  
  /*LPTIM计数周期结束更新ARR*/
  LL_LPTIM_SetUpdateMode(LPTIM1,LL_LPTIM_UPDATE_MODE_ENDOFPERIOD);
  
  /*使能ARR中断*/
  LL_LPTIM_EnableIT_ARRM(LPTIM1);
  
  /*使能LPTIM*/
  LL_LPTIM_Enable(LPTIM1);
  
  /*配置重装载值：62500*/
  /*8000000/64/62500 = 2Hz*/
  LL_LPTIM_SetAutoReload(LPTIM1,256);//256@32768  62500@8M
  
  /*开启单次模式*/
  LL_LPTIM_StartCounter(LPTIM1,LL_LPTIM_OPERATING_MODE_ONESHOT);
  
  /*使能NVIC请求*/
  NVIC_EnableIRQ(LPTIM1_IRQn);
  NVIC_SetPriority(LPTIM1_IRQn,0);
}

/**
  * @brief  LPTIM ARR中断回调函数
  * @param  无
  * @retval 无
  */
void APP_LPTIMCallback(void)
{

  /*翻转LED*/
///  BSP_LED_Toggle(LED3);
///LL_GPIO_TogglePin(p_d3);
}
/**
  * @brief  进入STOP模式
  * @param  无
  * @retval 无
  */
static void APP_PwrEnterStopMode(void)
{
  /*使能PWR时钟*/
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
  /* 低功耗工作在STOP模式 */
  LL_PWR_EnableLowPowerRunMode();
  /*进入DeepSleep模式*/
  LL_LPM_EnableDeepSleep();

  /*等待中断指令*/
  __WFI();
}




//设为LSI为时钟 64分频 
void LPTIM_INI(void) 
{
/*使能LPTIM时钟*/
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_LPTIM1);
LL_RCC_LSI_Enable();
while(LL_RCC_LSI_IsReady() != 1){}
LL_RCC_SetLPTIMClockSource(LL_RCC_LPTIM1_CLKSOURCE_LSI);
/*配置并开启LPTIM*/
APP_ConfigLPTIM_OneShot();
}

void LPTIM_SET_wakeTime(void)
{    /* 关闭LPTIM */
    LL_LPTIM_Disable(LPTIM1);
    /* 使能LPTIM */
    LL_LPTIM_Enable(LPTIM1);
    /* 延时 2*LSI时钟 */
    DELAY_us(75);
    /*使能ARR中断*/
    LL_LPTIM_EnableIT_ARRM(LPTIM1); 
    /*配置重装载值：62500*/
    /*8000000/64/62500 = 2Hz    32768/64/256=2HZ()*/
    LL_LPTIM_SetAutoReload(LPTIM1,256);
  
    /*开启单次模式*/
    LL_LPTIM_StartCounter(LPTIM1,LL_LPTIM_OPERATING_MODE_ONESHOT);
    /* 进入STOP模式 */    
}






  
void SWD_EN_OR_DIS(char en)
{
 /*GPIOA配置*/
  LL_GPIO_InitTypeDef GPIO_InitStruct;
 
if(en)//
	{ 
  /*选择2号引脚*/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_13|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_AF0_SWJ;
  /*GPIOA初始化*/
  LL_GPIO_Init(GPIOA,&GPIO_InitStruct);
	}
else 
	{ 
  /*选择2号引脚*/
  GPIO_InitStruct.Pin = LL_GPIO_PIN_13|LL_GPIO_PIN_14;
  /*选择复用模式*/
  GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
  /*选择输出速度*/
  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_AF0_SWJ;
  /*GPIOA初始化*/
  LL_GPIO_Init(GPIOA,&GPIO_InitStruct);

  LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_13|LL_GPIO_PIN_14);
	}


}

