U20-0418差异文件_22

//                                yc_lpm.c    



#include "yc_lpm.h"

uint32_t lpm_read(volatile int *addr)
{
    return ((uint32_t(*)(volatile int *addr))FUNC_LPM_READ_ADDR)(addr);
}

void lpm_write(volatile int *addr, uint32_t value)
{
    ((void(*)(volatile int *addr, uint32_t value))FUNC_LPM_WRITE_ADDR)(addr, value);
}

void lpm_bt_write(uint8_t type, uint32_t val)
{
    //  ((void(*)(uint8_t type,uint32_t val))FUNC_LPM_BT_WRITE_ADDR)(type,val);
    enable_clock(CLKCLS_BT);
    *(volatile uint8_t *)0xc804c = (val & 0x000000ff) >> 0;
    delay_us(1);
    *(volatile uint8_t *)0xc804d = (val & 0x0000ff00) >> 8;
    delay_us(1);
    *(volatile uint8_t *)0xc804e = (val & 0x00ff0000) >> 16;
    delay_us(1);
    *(volatile uint8_t *)0xc804f = (val & 0xff000000) >> 24;
    delay_us(1);
    *(volatile uint8_t *)0xc8005 = 1 << type;
    delay_ms(1);
}

uint32_t lpm_bt_read(uint8_t type)
{
    if (type == LPMBT_WKUPLOW || type == LPMBT_WKUPHIGH)
    {
        return (((uint32_t(*)(uint8_t type))FUNC_LPM_BT_READ_ADDR)(type)) >> 2;
    }
    else
    {
        return (((uint32_t(*)(uint8_t type))FUNC_LPM_BT_READ_ADDR)(type));
    }
}

void lpm_sleep(void)
{
    ((void(*)())FUNC_LPM_SLEEP_ADDR)();
}

void setlpmval(volatile int *addr, uint8_t startbit, uint8_t bitwidth, uint32_t val)
{
    ((void(*)(volatile int *addr, uint8_t startbit, uint8_t bitwidth, uint32_t val))FUNC_SETLPMVAL_ADDR)(addr, startbit, bitwidth, val);
}

uint32_t readlpmval(volatile int *addr, uint8_t startbit, uint8_t bitwidth)
{
    uint32_t tmp = 0;
    if (32 == bitwidth)
    {
        tmp = lpm_read(addr);
        return ((tmp >> startbit) & ((1 << bitwidth) - 1));
    }
    else
    {
        return lpm_read(addr);
    }
}

void GPIO_Unused_Pd(void)
{
    for (int i = 0; i < 48; i++)
    {
        if (GPIO_CONFIG(i) == 0 || GPIO_CONFIG(i) == 4 || GPIO_CONFIG(i) == 5)
        {
            GPIO_CONFIG(i) |= GPCFG_PD;
        }
    }
}

static uint32_t value_rtc_1s = 0;

static uint32_t get_otp(void)
{
    uint32_t time;

    if (value_rtc_1s == 0)
    {
        read_otp(0x13e, (uint8_t *)&time, 2);
        time = (time == 0) ? 0x8000 : time;
        time &= (~((uint32_t)0x1 << 31));
    }
    else
    {
        time = value_rtc_1s;
        time |= ((uint32_t)0x1 << 31);
    }

    return time;
}

void BT_Hibernate(void)
{
#if (VERSIONS == EXIST_BT)
    if(TRUE == ipc_inited)
    {
        ipc_inited = FALSE;

        read_otp(0x13e, (uint8_t *)&value_rtc_1s, 2);
        value_rtc_1s = (value_rtc_1s == 0) ? 0x8000 : value_rtc_1s;

        BT_CONFIG &= ~(1 << BT_INIT_FLAG);

        NVIC_DisableIRQ(BT_IRQn);
        SYSCTRL_ROM_SWITCH = 0x90;

        HCI_TypeDef IpcRxData;
        IpcRxData.type = 1;
        IpcRxData.opcode = 0x27;
        IpcRxData.DataLen = 0;
        IPC_TxData(&IpcRxData);
        //delay(10000);
        delay_ms(60);
    }
#elif (VERSIONS == NO_BT || VERSIONS == NO_XTAL)
    if(TRUE == ipc_inited)
    {
        ipc_inited = FALSE;
        BT_CONFIG &= ~(1 << BT_INIT_FLAG);
        NVIC_DisableIRQ(BT_IRQn);
        SYSCTRL_ROM_SWITCH = 0x90;
        lpm_bt_write(2,0);
        delay_us(1000);
        lpm_bt_write(3,0);
        delay_us(1000);
        lpm_bt_write(5,0);
        delay_us(1000);
        lpm_bt_write(1,0xd80000);
        delay_us(1000);
        lpm_bt_write(4,0x50000);
        delay_us(1000);
    }
#endif
}

void Chip_Speedstep(void)
{
    SYSCTRL_HCLKConfig(SYSCTRL_HCLK_Div8);
}

void CM0_Sleep(uint32_t time, uint32_t GPIO_Pin0_Pin31, uint16_t GPIO_Pin32_Pin47, uint8_t islow_wakeup, uint8_t is_powerdownbt)
{
    uint32_t temp;

    SYSCTRL_AHBPeriphClockCmd(SYSCTRL_AHBPeriph_INTR | SYSCTRL_AHBPeriph_SHA | \
                            SYSCTRL_AHBPeriph_CRC | SYSCTRL_AHBPeriph_PWM | \
                            SYSCTRL_AHBPeriph_WDT | SYSCTRL_AHBPeriph_USB | \
                            SYSCTRL_AHBPeriph_SPI | SYSCTRL_AHBPeriph_DES | \
                            SYSCTRL_AHBPeriph_RSA | SYSCTRL_AHBPeriph_ASE | \
                            SYSCTRL_AHBPeriph_7816 | SYSCTRL_AHBPeriph_SM4 | \
                            SYSCTRL_AHBPeriph_7811 | SYSCTRL_AHBPeriph_ADC7811 | \
                            SYSCTRL_AHBPeriph_CP, DISABLE);

    //DISABLE RTC WAKEUP
    setlpmval(LPM_GPIO_WKHI, 17, 1, 0);

    //set gpio wakeup level
    setlpmval(LPM_GPIO_WKHI, 18, 1, islow_wakeup ? 1 : 0);

    //set gpio num
    if(GPIO_Pin0_Pin31!=0 || GPIO_Pin32_Pin47!=0)
    {
        for(int i = 0;i < 32;i++)
        {
            if((GPIO_Pin0_Pin31 & (1<<i)) != 0)
            {
                if (islow_wakeup)
                    GPIO_CONFIG(i) = PULL_UP;
                else
                    GPIO_CONFIG(i) = PULL_DOWN;
            }
        }
        for(int i = 0;i<16;i++)
        {
            if((GPIO_Pin32_Pin47 & (1<<i)) != 0)
            {
                if (islow_wakeup)
                    GPIO_CONFIG(i+32) = PULL_UP;
                else
                    GPIO_CONFIG(i+32) = PULL_DOWN;
            }
        }
        setlpmval(LPM_GPIO_WKUP, 0, 32, GPIO_Pin0_Pin31);
        setlpmval(LPM_GPIO_WKHI, 0, 16, GPIO_Pin32_Pin47);
    }
    else
    {
        setlpmval(LPM_GPIO_WKUP, 0, 32, 0);
        setlpmval(LPM_GPIO_WKHI, 0, 16, 0);
    }

    temp = get_otp();

    if (time)
    {
        //SET SECMAX
        setlpmval(LPM_SECMAX, 0, 16, temp);
        //SET SLEEP CNT
        setlpmval(LPM_WKUP_TIMER, 0, 32, time);
        //clr RTC CNT
        setlpmval(LPM_RTC_CNT, 0, 32, 0);
        // ENABLE RTC WAKEUP
        setlpmval(LPM_GPIO_WKHI, 17, 1, 1);
    }

    if (is_powerdownbt == 1 && (temp >> 31) == 0)
    {
        BT_Hibernate();
    }

    lpm_sleep();
}

void enable_gpio_32(void)
{
    uint32_t value = lpm_bt_read(LPMBT_CONTROL1);
    value &= ~(1<<17);
    lpm_bt_write(LPMBT_CONTROL1, value);
}






























//                          flash_start.s



			AREA    |.flash_start|, CODE, READONLY  ,ALIGN=4

Reset_Handler PROC
			EXPORT  Reset_Handler
			IMPORT  __main
			LDR 	R0, =__main
			BX 		R0
			ENDP	


hard_fault_handler PROC
			EXPORT  hard_fault_handler 
			ldr r0,=HARD_FAULT_IRQHandler       
			bx r0
			nop
			ENDP
		
svc_handler PROC
			EXPORT  svc_handler         
			ldr r0,=SVC_IRQHandler
			bx r0
			nop
			ENDP

pendsv_handler PROC
			EXPORT  pendsv_handler      
			ldr r0,=PENDSV_IRQHandler
			bx r0
			nop
			ENDP
		
systick 	PROC
			EXPORT systick 
			ldr r0,=SYSTICK_IRQHandler
			bx r0
			nop
			ENDP
		
irq0 		PROC
			EXPORT irq0
			movs r0,#4*0
			b isr
			ENDP
				
irq1 		PROC
			EXPORT irq1
			movs r0,#4*1
			b isr
			ENDP
				
irq2 		PROC
			EXPORT irq2
			movs r0,#4*2
			b isr
			ENDP
				
irq3 		PROC
			EXPORT irq3
			movs r0,#4*3
			b isr
			ENDP

irq4 		PROC
			EXPORT irq4
			movs r0,#4*4
			b isr
			ENDP
				
irq5 		PROC
			EXPORT irq5
			movs r0,#4*5
			b isr
			ENDP
				
irq6 		PROC
			EXPORT irq6
			movs r0,#4*6
			b isr
			ENDP
				
irq7 		PROC
			EXPORT irq7
			movs r0,#4*7
			b isr
			ENDP

irq8 		PROC
			EXPORT irq8
			movs r0,#4*8
			b isr
			ENDP
				
irq9 		PROC
			EXPORT irq9
			movs r0,#4*9
			b isr
			ENDP
				
irq10 		PROC
			EXPORT irq10
			movs r0,#4*10
			b isr
			ENDP
				
irq11 		PROC
			EXPORT irq11
			movs r0,#4*11
			b isr
			ENDP

irq12 		PROC
			EXPORT irq12
			movs r0,#4*12
			b isr
			ENDP
				
irq13 		PROC
			EXPORT irq13
			movs r0,#4*13
			b isr
			ENDP
				
irq14 		PROC
			EXPORT irq14
			movs r0,#4*14
			b isr
			ENDP
				
irq15 		PROC
			EXPORT irq15
			movs r0,#4*15
			b isr
			ENDP
				
irq16 		PROC
			EXPORT irq16
			movs r0,#4*16
			b isr
			ENDP
				
irq17 		PROC
			EXPORT irq17
			movs r0,#4*17
			b isr
			ENDP
				
irq18 		PROC
			EXPORT irq18
			movs r0,#4*18
			b isr
			ENDP
				
irq19 		PROC
			EXPORT irq19
			movs r0,#4*19
			b isr
			ENDP

irq20 		PROC
			EXPORT irq20
			movs r0,#4*20
			b isr
			ENDP
				
irq21 		PROC
			EXPORT irq21
			movs r0,#4*21
			b isr
			ENDP
				
irq22 		PROC
			EXPORT irq22
			movs r0,#4*22
			b isr
			ENDP
				
irq23 		PROC
			EXPORT irq23
			movs r0,#4*23
			b isr
			ENDP

irq24 		PROC
			EXPORT irq24
			movs r0,#4*24
			b isr
			ENDP
				
irq25 		PROC
			EXPORT irq25
			movs r0,#4*25
			b isr
			ENDP
				
irq26 		PROC
			EXPORT irq26
			movs r0,#4*26
			b isr
			ENDP
				
irq27 		PROC
			EXPORT irq27
			movs r0,#4*27
			b isr
			ENDP

irq28 		PROC
			EXPORT irq28
			movs r0,#4*28
			b isr
			ENDP
				
irq29 		PROC
			EXPORT irq29
			movs r0,#4*29
			b isr
			ENDP
				
irq30		PROC
			EXPORT irq30
			movs r0,#4*30
			b isr
			ENDP
				
irq31 		PROC
			EXPORT irq31
			movs r0,#4*31
			b isr
			ENDP				
				

isr    		PROC
			ldr r1,=isr_table
			ldr r0,[r0, r1]
			bx r0
			ENDP
					
				ALIGN	
NMI_IRQHandler  		PROC
						EXPORT      NMI_IRQHandler				[WEAK]
						B	.
						ENDP

HARD_FAULT_IRQHandler   PROC
						EXPORT      HARD_FAULT_IRQHandler		[WEAK]
						B	.
						ENDP

SVC_IRQHandler   		PROC
						EXPORT      SVC_IRQHandler				[WEAK]
						B	.
						ENDP

PENDSV_IRQHandler   	PROC
						EXPORT      PENDSV_IRQHandler			[WEAK]
						B	.
						ENDP
							
SYSTICK_IRQHandler   	PROC
						EXPORT      SYSTICK_IRQHandler			[WEAK]
						B	.
						ENDP
					
EXTI0_IRQHandler   		PROC
						EXPORT      EXTI0_IRQHandler			[WEAK]
						B	.
						ENDP
							
EXTI1_IRQHandler   		PROC
						EXPORT      EXTI1_IRQHandler			[WEAK]
						B	.
						ENDP
							
EXTI2_IRQHandler   		PROC
						EXPORT      EXTI2_IRQHandler			[WEAK]
						B	.
						ENDP
							
EXTI3_IRQHandler   		PROC
						EXPORT      EXTI3_IRQHandler			[WEAK]
						B	.
						ENDP
							
EXTI4_IRQHandler   		PROC
						EXPORT      EXTI4_IRQHandler			[WEAK]
						B	.
						ENDP
							
EXTI5_IRQHandler   		PROC
						EXPORT      EXTI5_IRQHandler			[WEAK]
						B	.
						ENDP	
					
Default_Handler PROC
; ToDo:  Add here the export definition for the device specific external interrupts handler
                EXPORT		USB_IRQHandler	 	[WEAK]
				EXPORT		IIC_IRQHandler   	[WEAK]
				EXPORT		QSPI_IRQHandler  	[WEAK]
				EXPORT		SPI0_IRQHandler  	[WEAK]
				EXPORT		SPI1_IRQHandler  	[WEAK]
				EXPORT		UART0_IRQHandler 	[WEAK]
				EXPORT		UART1_IRQHandler 	[WEAK]
				EXPORT 		MEMCP_IRQHandler 	[WEAK]				
				EXPORT		RSA_IRQHandler   	[WEAK]
				EXPORT		SCI0_IRQHandler  	[WEAK]
				EXPORT		SCI1_IRQHandler  	[WEAK]
				EXPORT		BT_IRQHandler 		[WEAK]
				EXPORT		GPIO_IRQHandler    	[WEAK]
				EXPORT		TIMER0_IRQHandler	[WEAK]
				EXPORT		TIMER1_IRQHandler	[WEAK]
				EXPORT		TIMER2_IRQHandler	[WEAK]
				EXPORT		TIMER3_IRQHandler	[WEAK]
				EXPORT		TIMER4_IRQHandler	[WEAK]
				EXPORT		TIMER5_IRQHandler	[WEAK]
				EXPORT		TIMER6_IRQHandler	[WEAK]
				EXPORT		TIMER7_IRQHandler	[WEAK]
				EXPORT		TIMER8_IRQHandler 	[WEAK]
				EXPORT		SM4_IRQHandler   	[WEAK]	
				EXPORT		SEC_IRQHandler		[WEAK]	
				EXPORT		MSR_IRQHandler		[WEAK]	
				EXPORT		TRNG_IRQHandler		[WEAK]	
				EXPORT 		WDT_IRQHandler		[WEAK]

; ToDo:  Add here the names for the device specific external interrupts handler
USB_IRQHandler	 	
IIC_IRQHandler   	
QSPI_IRQHandler  	
SPI0_IRQHandler  	
SPI1_IRQHandler  	
UART0_IRQHandler 	
UART1_IRQHandler 	
MEMCP_IRQHandler 	
RSA_IRQHandler   	
SCI0_IRQHandler  	
SCI1_IRQHandler  	
BT_IRQHandler 		
GPIO_IRQHandler    	
TIMER0_IRQHandler	
TIMER1_IRQHandler	
TIMER2_IRQHandler	
TIMER3_IRQHandler	
TIMER4_IRQHandler	
TIMER5_IRQHandler	
TIMER6_IRQHandler	
TIMER7_IRQHandler	
TIMER8_IRQHandler 	
SM4_IRQHandler   	
SEC_IRQHandler		
MSR_IRQHandler		
TRNG_IRQHandler		
WDT_IRQHandler		
                B       .
                ENDP
					
					
					
			EXPORT isr_table				
isr_table	DCD     USB_IRQHandler	 
			DCD 	IIC_IRQHandler   
			DCD 	QSPI_IRQHandler  
			DCD 	SPI0_IRQHandler  
			DCD 	SPI1_IRQHandler  
			DCD 	UART0_IRQHandler 
			DCD 	UART1_IRQHandler 
			DCD 	MEMCP_IRQHandler 
			DCD 	RSA_IRQHandler   
			DCD 	SCI0_IRQHandler  
			DCD 	SCI1_IRQHandler  
			DCD 	BT_IRQHandler 
			DCD 	GPIO_IRQHandler         
			DCD 	TIMER0_IRQHandler
			DCD 	TIMER1_IRQHandler
			DCD 	TIMER2_IRQHandler
			DCD 	TIMER3_IRQHandler
			DCD 	TIMER4_IRQHandler
			DCD 	TIMER5_IRQHandler
			DCD 	TIMER6_IRQHandler
			DCD 	TIMER7_IRQHandler
			DCD 	TIMER8_IRQHandler 
			DCD 	SM4_IRQHandler   
			DCD 	SEC_IRQHandler
			DCD 	MSR_IRQHandler
			DCD 	TRNG_IRQHandler
			DCD 	WDT_IRQHandler
			END
			
			



		
















//                           usbd_printer_core.c



/* Includes ------------------------------------------------------------------*/
#include "usbd_printer_core.h"
#include "usbd_printer_vcp.h"
#include "usbd_desc.h"
#include "usbd_req.h"
#include "usbd_usr.h"
#include "yc_timer.h"
#include "misc.h"
#include "driver_uart0.h"
#include "tools_fifo.h"
#include "api_data_analysis.h"
/** @defgroup usbd_printer
  * @brief usbd core module
  * @{
  */

/** @defgroup usbd_printer_Private_TypesDefinitions
  * @{
  */
/**
  * @}
  */


/** @defgroup usbd_printer_Private_Defines
  * @{
  */
/**
  * @}
  */


/** @defgroup usbd_printer_Private_Macros
  * @{
  */
/**
  * @}
  */


/** @defgroup usbd_printer_Private_FunctionPrototypes
  * @{
  */
  
static uint32_t printerCmd = 0xFF;
static uint32_t printerLen = 0;
static uint8_t  CmdBuff[PRINTER_CMD_PACKET_SZE];
static uint32_t  usbd_printer_AltSet;
uint8_t 		g_printer_data_buf[PRINTER_DATA_MAX_PACKET_SIZE];	//接收到的数据 
uint8_t 		g_send_finish_flag = 1;									//发送完成标记

/*********************************************
   PRINTER Device library callbacks
 *********************************************/
static uint8_t  usbd_printer_Init(void  *pdev, uint8_t cfgidx);
static uint8_t  usbd_printer_DeInit(void  *pdev, uint8_t cfgidx);
static uint8_t  usbd_printer_Setup(void  *pdev, USB_SETUP_REQ *req);
static uint8_t  usbd_printer_EP0_RxReady(void *pdev);
static uint8_t  usbd_printer_DataIn(void *pdev, uint8_t epnum);
static uint8_t  usbd_printer_DataOut(void *pdev, uint8_t epnum);
static uint8_t  usbd_printer_SOF(void *pdev);

/*********************************************
   PRINTER specific management functions
 *********************************************/
static uint8_t  *USBD_printer_GetCfgDesc(uint8_t speed, uint16_t *length);
#ifdef USE_USB_OTG_HS
    static uint8_t  *USBD_printer_GetOtherCfgDesc(uint8_t speed, uint16_t *length);
#endif
/**
  * @}
  */

/** @defgroup usbd_printer_Private_Variables
  * @{
  */
extern uint8_t USBD_DeviceDesc   [USB_SIZ_DEVICE_DESC];


/* PRINTER interface class callbacks structure */
USBD_Class_cb_TypeDef  USBD_PRINTER_cb =
{
    usbd_printer_Init,
    usbd_printer_DeInit,
    usbd_printer_Setup,
    NULL,                 /* EP0_TxSent, */
    usbd_printer_EP0_RxReady,
    usbd_printer_DataIn,
    usbd_printer_DataOut,
    usbd_printer_SOF,
    NULL,
    NULL,
    USBD_printer_GetCfgDesc,
#ifdef USE_USB_OTG_HS
    USBD_printer_GetOtherCfgDesc, /* use same cobfig as per FS */
#endif /* USE_USB_OTG_HS  */
};

#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
    #if defined ( __ICCARM__ ) /*!< IAR Compiler */
        #pragma data_alignment=4
    #endif
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
/* USB PRINTER device Configuration Descriptor */
__ALIGN_BEGIN uint8_t usbd_printer_CfgDesc[USB_PRINTER_CONFIG_DESC_SIZ]  __ALIGN_END =
{
    /*Configuation Descriptor*/
    0x09,   /* bLength: Configuation Descriptor size */
    USB_CONFIGURATION_DESCRIPTOR_TYPE,      /* bDescriptorType: Configuration */
    USB_PRINTER_CONFIG_DESC_SIZ,       /* wTotalLength:no of returned bytes */
    0x00,

    0x01,   /* bNumInterfaces: 1 interface */

    0x01,   /* bConfigurationValue: Configuration value */
    0x00,   /* iConfiguration: Index of string descriptor describing the configuration */
    0xc0,   /* bmAttributes: self powered */
    0x32,   /* MaxPower 100 mA */
    /*Interface Descriptor*/
    0x09,   /* bLength: Interface Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: Interface */
    /* Interface descriptor type */
    0x00,   /* bInterfaceNumber: Number of Interface */
    0x00,   /* bAlternateSetting: Alternate setting */
    0x02,   /* bNumEndpoints: One endpoints used */

    0x07,  //basic class for printer
    0x01,  //printer calll device

    0x02, // bi-directional interface.
    0x04,   /* iInterface: */

    /*Endpoint 3 Descriptor*/
    0x07,   /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
    PRINTER_OUT_EP,   /* bEndpointAddress: (OUT3) */
    0x02,   /* bmAttributes: Bulk */
    0x40,             /* wMaxPacketSize: */
    0x00,
    0x00,   /* bInterval: ignore for Bulk transfer */
    /*Endpoint 1 Descriptor*/
    0x07,   /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
    PRINTER_IN_EP,   /* bEndpointAddress: (IN1) */
    0x02,   /* bmAttributes: Bulk */
    0x40,             /* wMaxPacketSize: */
    0x00,
    0x00,    /* bInterval */
    
    /*Endpoint 1 Descriptor*/
    0x07,   /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
    PRINTER_CMD_EP,   /* bEndpointAddress: (IN1) */
    0x03,             /* bmAttributes: Bulk */
    0x40,             /* wMaxPacketSize: */
    0x00,
    0x01              /* bInterval */
};

/* USB PRINTER device id Descriptor */
__ALIGN_BEGIN uint8_t print_id_descriptor[] __ALIGN_END =
{
    0x00,
    0x00,
    'p', 'r', 'i', 'n', 't', 'e', 'r', ';',
};

#ifdef USE_USB_OTG_HS
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
    #if defined ( __ICCARM__ ) /*!< IAR Compiler */
        #pragma data_alignment=4
    #endif
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
__ALIGN_BEGIN uint8_t usbd_printer_OtherCfgDesc[USB_PRINTER_CONFIG_DESC_SIZ]  __ALIGN_END =
{
};
#endif /* USE_USB_OTG_HS  */

/**
  * @}
  */

/** @defgroup usbd_printer_Private_Functions
  * @{
  */

/**
  * @brief  usbd_printer_Init
  *         Initilaize the PRINTER interface
  * @param  pdev: device instance
  * @param  cfgidx: Configuration index
  * @retval status
  */
static uint8_t  usbd_printer_Init(void  *pdev,
                                  uint8_t cfgidx)
{
//  uint8_t *pbuf;

    /* Open EP IN */
    DCD_EP_Open(pdev,
                PRINTER_IN_EP,
                PRINTER_DATA_IN_PACKET_SIZE,
                USB_OTG_EP_BULK);

    /* Open EP OUT */
    DCD_EP_Open(pdev,
                PRINTER_OUT_EP,
                PRINTER_DATA_OUT_PACKET_SIZE,
                USB_OTG_EP_BULK);

    /* Open Command IN EP */
    DCD_EP_Open(pdev,
                PRINTER_CMD_EP,
                PRINTER_CMD_PACKET_SZE,
                USB_OTG_EP_INT);

//  pbuf = (uint8_t *)USBD_DeviceDesc;
//  pbuf[4] = DEVICE_CLASS_PRINTER;
//  pbuf[5] = DEVICE_SUBCLASS_PRINTER;

    /* Prepare Out endpoint to receive next packet */
    DCD_EP_PrepareRx(pdev,
                     PRINTER_OUT_EP,
                     (uint8_t *)(g_printer_data_buf),
                     PRINTER_DATA_OUT_PACKET_SIZE);

    return USBD_OK;
}

/**
  * @brief  usbd_printer_Init
  *         DeInitialize the PRINTER layer
  * @param  pdev: device instance
  * @param  cfgidx: Configuration index
  * @retval status
  */
static uint8_t  usbd_printer_DeInit(void  *pdev,
                                    uint8_t cfgidx)
{
    /* Open EP IN */
    DCD_EP_Close(pdev,
                 PRINTER_IN_EP);

    /* Open EP OUT */
    DCD_EP_Close(pdev,
                 PRINTER_OUT_EP);

    /* Open Command IN EP */
    DCD_EP_Close(pdev,
                 PRINTER_CMD_EP);

    return USBD_OK;
}

/**
  * @brief  usbd_printer_Setup
  *         Handle the PRINTER specific requests
  * @param  pdev: instance
  * @param  req: usb requests
  * @retval status
  */
static uint8_t  usbd_printer_Setup(void  *pdev,
                                   USB_SETUP_REQ *req)
{
    uint16_t len = USB_PRINTER_DESC_SIZ;
    uint8_t  *pbuf = usbd_printer_CfgDesc + 9;

    switch (req->bmRequest & USB_REQ_TYPE_MASK)
    {
    /* PRINTER Class Requests -------------------------------*/
    case USB_REQ_TYPE_CLASS :
        /* Check if the request is a data setup packet */
        if (req->wLength)
        {
            /* Check if the request is Device-to-Host */
            if (req->bmRequest & 0x80)
            {
                /* Get the data to be sent to Host from interface layer */
                //APP_FOPS.pIf_Ctrl(req->bRequest, CmdBuff, req->wLength);

                /* Send the data to the host */
                print_id_descriptor[0] = sizeof(print_id_descriptor) >> 8;
                print_id_descriptor[1] = sizeof(print_id_descriptor);
                USBD_CtlSendData(pdev,
                                 print_id_descriptor,
                                 sizeof(print_id_descriptor));
            }
            else /* Host-to-Device requeset */
            {
                /* Set the value of the current command to be processed */
                printerCmd = req->bRequest;
                printerLen = req->wLength;

                /* Prepare the reception of the buffer over EP0
                Next step: the received data will be managed in usbd_printer_EP0_TxSent()
                function. */
                //     MyPrintf("printer class \n\r");
                USBD_CtlPrepareRx(pdev,
                                  CmdBuff,
                                  req->wLength);
				
                if (req->wLength != 0)
                {
                    USBD_CtlSendStatus(pdev);
                }
            }
        }
		
        return USBD_OK;

    default:
        USBD_CtlError(pdev, req);
        return USBD_FAIL;



    /* Standard Requests -------------------------------*/
    case USB_REQ_TYPE_STANDARD:
        switch (req->bRequest)
        {
        case USB_REQ_GET_DESCRIPTOR:
            if ((req->wValue >> 8) == PRINTER_DESCRIPTOR_TYPE)
            {
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
                pbuf = usbd_printer_Desc;
#else
                pbuf = usbd_printer_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM);
#endif
                len = MIN(USB_PRINTER_DESC_SIZ, req->wLength);
            }

            USBD_CtlSendData(pdev,
                             pbuf,
                             len);
            break;

        case USB_REQ_GET_INTERFACE :
            USBD_CtlSendData(pdev,
                             (uint8_t *)&usbd_printer_AltSet,
                             1);
            break;

        case USB_REQ_SET_INTERFACE :
            if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM)
            {
                usbd_printer_AltSet = (uint8_t)(req->wValue);
            }
            else
            {
                /* Call the error management function (command will be nacked */
                USBD_CtlError(pdev, req);
            }
            break;
        }
    }
    return USBD_OK;
}

/**
  * @brief  usbd_printer_EP0_RxReady
  *         Data received on control endpoint
  * @param  pdev: device device instance
  * @retval status
  */
static uint8_t  usbd_printer_EP0_RxReady(void  *pdev)
{
    return USBD_OK;
}

/**
  * @brief  usbd_audio_DataIn
  *         Data sent on non-control IN endpoint
  * @param  pdev: device instance
  * @param  epnum: endpoint number
  * @retval status
  */
static uint8_t  usbd_printer_DataIn(void *pdev, uint8_t epnum)
{
	g_send_finish_flag = 1;
    return USBD_OK;
}

/**
  * @brief  usbd_printer_DataOut
  *         Data received on non-control Out endpoint
  * @param  pdev: device instance
  * @param  epnum: endpoint number
  * @retval status
  */
static uint8_t  usbd_printer_DataOut(void *pdev, uint8_t epnum)
{
    uint16_t USB_Rx_Cnt;
	uint16_t i = 0;

    /* Get the received data buffer and update the counter */

    /* USB data will be immediately processed, this allow next USB traffic being
       NAKed till the end of the application Xfer */
    /* Prepare Out endpoint to receive next packet */

    DCD_EP_PrepareRx(pdev,
                     PRINTER_OUT_EP,
                     (uint8_t *)(g_printer_data_buf),
                     PRINTER_DATA_OUT_PACKET_SIZE);

    USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE *)pdev)->dev.out_ep[epnum].xfer_count;;
	
	for(i = 0; i<USB_Rx_Cnt; i++){
		FIFO_DataAnalysis_AddByte(FROM_USB,g_printer_data_buf[i]);
	}
	
	#if 0
		MyPrintf("R:");
			for(int i=0; i < USB_Rx_Cnt; i++)	MyPrintf("%02x ",g_printer_data_buf[i]);
		MyPrintf("\n");	
	#endif 

    return USBD_OK;
}

/**
  * @brief  usbd_audio_SOF
  *         Start Of Frame event management
  * @param  pdev: instance
  * @param  epnum: endpoint number
  * @retval status
  */
static uint8_t  usbd_printer_SOF(void *pdev)
{
    return USBD_OK;
}

/**
  * @brief  USBD_printer_GetCfgDesc
  *         Return configuration descriptor
  * @param  speed : current device speed
  * @param  length : pointer data length
  * @retval pointer to descriptor buffer
  */
static uint8_t  *USBD_printer_GetCfgDesc(uint8_t speed, uint16_t *length)
{
    *length = sizeof(usbd_printer_CfgDesc);
    return usbd_printer_CfgDesc;
}

/**
  * @brief  USBD_printer_GetCfgDesc
  *         Return configuration descriptor
  * @param  speed : current device speed
  * @param  length : pointer data length
  * @retval pointer to descriptor buffer
  */
#ifdef USE_USB_OTG_HS
static uint8_t  *USBD_printer_GetOtherCfgDesc(uint8_t speed, uint16_t *length)
{
    *length = sizeof(usbd_printer_OtherCfgDesc);
    return usbd_printer_OtherCfgDesc;
}
#endif
/**
  * @}
  */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT Yichip Microelectronics *****END OF FILE****/



























//               012_U20\app\mdk_v5\ConfigFiles\YC3121_keil.sct


; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00000000 0x0001fff  {    ; load region size_region
  ER_IROM1 0x00000000 0x00001fff  {  ; load address = execution address
   startup.o (RESET, +First)
   startup.o (|.text|,+RO)
;   *(InRoot$$Sections)
  }
  ;ER_IROM2 0x4000   {
  ;rom_main.o (+RO)
  ;}
  
  ;ER_IROM3 0x100000 {
	  ;*(InRoot$$Sections)
  ;}
	
  ;ER_IROM4 0x100400   {
  ;flash_start.o (+RO)
  ;.ANY (+RO) 
  ;}
  
  ;RW_IRAM1 0x000d0000 0x0010000  {  ; RW data
   ;.ANY (+RW +ZI)
  ;}
  
;  ARM_LIB_STACK 0xE0000 EMPTY -0x10000{}
}

;LR_IROM2 0x4000 0x4000{
;	ER_IROM2 0x4000 {
;	  rom_main.o (+RO)
;	}
;}

;No boot---
;LR_IROM3 0x1000200 0x200{
;	ER_IROM3 0x1000200 {
;	  flash_start.o (|.flash_start|,+RO)
;	}
;}

;LR_IROM4 0x1000400 0x1000000{
;	ER_IROM4 0x1000400 {
;;;	  flash_start.o (|.flash_start|,+RO)
;	  *(InRoot$$Sections)
;	  .ANY (+RO)
;	}
	
	
;	 RW_IRAM2 0x00020000 0x010000  {  ; RW data
;	.ANY (+RW +ZI)
;	}
;}

;with boot 
LR_IROM3 0x1020000 0x200{
	ER_IROM3 0x1020000 {
	  flash_start.o (|.flash_start|,+RO)
	}
}

LR_IROM4 0x1020200 0x1000000{
	ER_IROM4 0x1020200 {
;	  flash_start.o (|.flash_start|,+RO)
	  *(InRoot$$Sections)
	  .ANY (+RO)
	}
	
	
	 RW_IRAM2 0x00020000 0x010000  {  ; RW data
	.ANY (+RW +ZI)
	}
}


















//                        bootload

//                 api_power_control.c


 
/******************************************************************************
版权所有:  深圳市。。科技有限公司 
文件名:    api_power_control.c
作者:      wangdy
创建日期:  2020/07/8
描述:      蓝牙模块协议解析及处理 
其它:      
修改历史:  //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
            序号    修改时间    修改人  修改内容
			????    ????/??/??  ??????  参考样式       
******************************************************************************/

/************************************头文件************************************/

#include "yc_gpio.h"
#include "api_power_control.h"
#include "bsp_power_control.h"
#include "bsp_charge_control.h"
#include "api_led_watchdog.h"
#include <string.h>
#include "yc_7816.h"
#include "driver_adc.h"
#include "var_global.h"

/*************************************变量*************************************/

_POWER_KEY_STATE 		Power_Key_State = {0};		//按键状态信息 

_CHARGE_CONTROL_STATE   Charge_Control_Flag = 	//充电状态信息 
{
	.ChargeControl_Flag = true,
	.Charging_Flag = false,
	.ChargeFinish_Flag = false,
};

BATTERY_TEMP_STATE		Battery_Temp_State = BATTERY_TEMP_NORMAL;		//电池温度检测 

uint16_t                Power_Bat_Value = 0;  		//电池电量  

/*************************************函数*************************************/

/*******************************************************************************
* 名称:		API_Power_Control_Init       
* 描述:		电源控制初始化 
* 输入参数:	无  
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
void API_Power_Control_Init(void)
{
	//特殊引脚功能使能 
	vcard_control(1);		//初始化智能卡  可当智能卡应用  
	enable_gpio_32();		//使能GPIO32 
	
	Power_Control_Init();		//电源控制   初始化
	Charge_Control_Init();		//充电控制   初始化 
	
	API_Bat_Charge_OnOff(true);		//使能电池充电  
	
	Power_Key_State.HighCheckCount = 0;
	Power_Key_State.CheckFinished = false;
	Power_Key_State.ProgramExecute = false;
	Power_Key_State.WorkMode = GOTO_NONE;
	Power_Key_State.PowerOffKeyRelease = false;
	Power_Key_State.PowerOffCheckStart = false;
	Power_Key_State.PowerOffCheckCount = 0;
	Power_Key_State.Power_On_Key_Release_Prepare_Flag = false;
}


/*******************************************************************************
* 名称:		API_Bat_Charge_OnOff    
* 描述:		电池充电功能开/关  
* 输入参数:	无  
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
void API_Bat_Charge_OnOff(bool state)
{
	
	if(state)
	{
		Charge_Control_Flag.ChargeControl_Flag = true;
		Matchine_Bat_Charge_On();
	}
	else 
	{
		Charge_Control_Flag.ChargeControl_Flag = false;
		Matchine_Bat_Charge_Off();
	}
	
}

/*******************************************************************************
* 名称:		Tape_UseUp_Check      
* 描述:		电池温度检测   
* 输入参数:	无  
* 输出参数:	无   
* 其它:		adc接收完成中断  调用 
*******************************************************************************/
void Battery_Voltage_Check(){
	
#if 0
	static uint32_t  sum_values = 0;   //求和  
	static uint32_t  sum_count = 0;   //计数   
#endif
	static uint16_t Battery_High_Temp_Counter = 0;		 //电池高温次数计数
	static uint16_t Battery_Low_Temp_Counter=0;      	//电池低温次数计数
	
#if BATTERY_TEMPER_CHECK_ENABLE_FLAG
	
	if(false == ChargingState_Get())    //不插USB时,要执行引导程序要不按下按键要么插上USB充电
	{
		Battery_Temp_State = BATTERY_TEMP_NORMAL;
		return ;
	}
	
	uint16_t  adc_value = ADC_Get_Value(ADC_BATTERY_NTC_TEMP);	//电池电量检测  
//	MyPrintf("adc_value_NTC=%d\n",adc_value);
	
	//当前是正常状态 
	if(Battery_Temp_State == BATTERY_TEMP_NORMAL)
	{
		//小于0度       
		//if(adc_value >= 1200)
		if(adc_value >= BATTERY_LOW_TEMPERATURE_THRESHOLD)
		{
//			MyPrintf("BATTERY_TEMP_OVER_LOW--\r\n"); 
			Battery_Low_Temp_Counter++;
			
		}
		//大于45度  
		else if(adc_value <= BATTERY_HIGH_TEMPERATURE_THRESHOLD)     //150
		{
//			MyPrintf("BATTERY_TEMP_OVER_HIGH--000\r\n"); 
			Battery_High_Temp_Counter++;
		}
		else{
			Battery_Low_Temp_Counter = 0;
			Battery_High_Temp_Counter = 0;
			Battery_Temp_State = BATTERY_TEMP_NORMAL;
		}
	}
	//如果当前是高温状态 
	else if(Battery_Temp_State == BATTERY_TEMP_OVER_HIGH){
		 if(adc_value >= BAT_HIGH_TEMPERATURE_RECOVER_THRESHOLD){
			 Battery_High_Temp_Counter = 0;
			 Battery_Temp_State = BATTERY_TEMP_NORMAL;
		 }
	}
	//如果是低温状态 
	else if(Battery_Temp_State == BATTERY_TEMP_OVER_LOW){
		if(adc_value <= BAT_LOW_TEMPERATURE_RECOVER_THRESHOLD){
			Battery_Low_Temp_Counter = 0;
			Battery_Temp_State = BATTERY_TEMP_NORMAL;
		}
	}
	if(BAT_TEMPERATURE_CHECK_TIMES<=Battery_Low_Temp_Counter){
		Battery_Temp_State = BATTERY_TEMP_OVER_LOW;
	}
	if(BAT_TEMPERATURE_CHECK_TIMES<=Battery_High_Temp_Counter){
		Battery_Temp_State = BATTERY_TEMP_OVER_HIGH;
	}
	#if 0
		sum_values += adc_value;
		sum_count++;
	
		if(sum_count >= 10){
			MyPrintf("off_v:%d_sta_%d\n",sum_values/sum_count,Battery_Temp_State);
			
			sum_count = 0;
			sum_values = 0;
		}
	#endif 
#else 
	Battery_Temp_State = BATTERY_TEMP_NORMAL;
#endif 
  //  MyPrintf("battery_temper:%d,state:%d\n",adc_value,Battery_Temp_State);
}

/*******************************************************************************
* 名称:		PowerControl_Process       
* 描述:		开关机检测 (判断是否进入DFU) 
* 输入参数:	
* 输出参数:	无   
* 其它:		
*******************************************************************************/
void PowerControl_Process(){
	
	Power_Voltage_Check();		//计算电池电压平均值  

#if BATTERY_TEMPER_CHECK_ENABLE_FLAG
	Battery_Voltage_Check();
#endif 
	
	//先判断是否插入USB  
	
	if(ChargingState_Get()){
//		MyPrintf("222222222222222\r\n");
		if(GlobalVar.API_Led_Control_Init_Finish != true)
				   API_Led_Control_Init();							//灯控初始化
		//看是否在充电过程中 
		if(Charge_Control_Flag.ChargeControl_Flag){		//充电中 判断是否充满了  
			
			if((Battery_Temp_State == BATTERY_TEMP_OVER_LOW) || (Battery_Temp_State == BATTERY_TEMP_OVER_HIGH)){		//电池温度异常  则停止充电 	
	//		MyPrintf("11111111\r\n");	
				Charge_Control_Flag.Charging_Flag = false;
				Charge_Control_Flag.ChargeFinish_Flag = false;
				API_Bat_Charge_OnOff(false);	//停止充电 
				MyPrintf("333333333333\r\n");
			}
			else {
	//			MyPrintf("READ_CHARGE_FINISH_STATE=%d\r\n",READ_CHARGE_FINISH_STATE);
				//电池满指示引脚,低电平有效
				if(RESET == READ_CHARGE_FINISH_STATE)  //低电平  表示还未充满  
				{
//					MyPrintf("Charging_Flag1111111111111\r\n");
					Charge_Control_Flag.ChargeFinish_Flag = false;
					Charge_Control_Flag.Charging_Flag = true;
					API_Bat_Charge_OnOff(true);		//启动充电 
				}
				else   //高电平 表示充满  则停止充电 
				{
					MyPrintf("ChargeFinish_Flagcccc\r\n");
					Charge_Control_Flag.ChargeFinish_Flag = true;
					Charge_Control_Flag.Charging_Flag = false;
					API_Bat_Charge_OnOff(false);	//停止充电 
				}		
			}
		}else{     //USB已经连接且不在充电中
			//如果在插入USB的前提下  电池温度正常  并且 实际电压小于 8V 
//			MyPrintf("33333333..\r\n");
//			if(Battery_Temp_State == BATTERY_TEMP_NORMAL) {
//		MyPrintf("Power_Bat_Value =%d\r\n",Power_Bat_Value);
				if(RESET == READ_CHARGE_FINISH_STATE)  //低电平  表示还未充满  
				{
  MyPrintf("44444444\r\n");
					Charge_Control_Flag.ChargeFinish_Flag = false;
					Charge_Control_Flag.Charging_Flag = true;
					API_Bat_Charge_OnOff(true);		//启动充电 
				}
				else   //高电平 表示充满  则停止充电 
				{
	MyPrintf("5555555\r\n");				
					Charge_Control_Flag.ChargeFinish_Flag = true;
					Charge_Control_Flag.Charging_Flag = false;
					API_Bat_Charge_OnOff(false);	//停止充电 
				}		
		}
	}else{   //未插USB 则停止充电 
		Charge_Control_Flag.Charging_Flag = false;
		Charge_Control_Flag.ChargeFinish_Flag = false;
		API_Bat_Charge_OnOff(false);	//停止充电 
	}

	
	//MyPrintf("voltage:%d,state:%d\n",Power_Bat_Value,Charge_Control_Flag.ChargeControl_Flag);	
}


/*******************************************************************************
* 名称:		Power_Voltage_Check  
* 描述:		各种电源电压检测  
* 输入参数:	无 
* 输出参数:	无   
* 其它:		
*******************************************************************************/
void Power_Voltage_Check(void)
{
	static uint32_t Sum_Power_Bat_Value = 0;
	static uint32_t CurrCnt = 0;
	uint32_t  temp_value = 0;				
	
	//求和  并且计数 + 1
	CurrCnt++;
	Sum_Power_Bat_Value += ADC_Get_Value(ADC_BAT_POWER);
	
	
	//求平均值     
	if(CurrCnt >= ADC_AVERAGE_COUNT)
	{
		//以下几个电压值,均为分压电阻分压 (499+75)/75 电压,则公式为: adc*574/75
		//如果保留3位小数点,则公式为: adc*574/75*1000
		
		//电池电压 
		temp_value = Sum_Power_Bat_Value/ADC_AVERAGE_COUNT;
		temp_value = temp_value*574/75;
		Power_Bat_Value = temp_value; //电压值,保留3位小数点 
		CurrCnt = 0;
		Sum_Power_Bat_Value = 0;
	}
}


/*******************************************************************************
* 名称:		IRQ_Power_Control_Check       
* 描述:		开关机检测 (判断是否进入DFU) 
* 输入参数:	
* 输出参数:	无   
* 其它:		长按2S钟开机  
			连续按3次进入dfu模式  
*******************************************************************************/
void IRQ_Power_Control_Check(void)
{  
	
	//状态判断  
	if(false == Power_Key_State.CheckFinished){
//		MyPrintf("POWER_KEY_PRESS_STATE= %d \n",POWER_KEY_PRESS_STATE);
		//高电平表示按键按下去了  则开始做计时处理  超过2S开机 
		if(SET == POWER_KEY_PRESS_STATE)
		{	
//			MyPrintf("111111111\n");
			//长按超过一定时间   则开机跳转至APP 
			Power_Key_State.LowCheckCount=0;
			if(Power_Key_State.WorkMode == GOTO_DFU) return;	
			Power_Key_State.HighCheckCount++;						
			if(Power_Key_State.HighCheckCount >= TIMEOUT_POWER_ON)     //按下超过2S
			{
//				MyPrintf("2222222\n");
	//			if(Power_Key_State.WorkMode != GOTO_DFU)
				{
			//		if(GlobalVar.API_Led_Control_Init_Finish != true)
					   API_Led_Control_Init();							//灯控初始化
					Power_Key_State.HighCheckCount = 0;
					Power_Key_State.Key_Pressed_Flag = false;
					
					Matchine_3V3_Power_On();					//打开3V3电源 
					
					Power_Key_State.WorkMode = GOTO_APP;
					Power_Key_State.CheckFinished = true;		//进入正常工作模式 	
					Power_Key_State.ProgramExecute = true;
					
					MyPrintf("READY POWER ON\n");	

					return;
				}
			}
			//超过消抖动时间 
			else if(Power_Key_State.HighCheckCount >= TIMEOUT_KEY_DITHER){
				Power_Key_State.Key_Pressed_Flag = true;	//按键按下去了  用于后面计次用 
			}
		}
		else
		{			
			Power_Key_State.HighCheckCount = 0;
			Power_Key_State.LowCheckCount++;				//按键计数信息,插上USB会一直进来计数 
//			MyPrintf("READY_release\n");
			if(Power_Key_State.LowCheckCount >= TIMEOUT_KEY_DITHER){
				Power_Key_State.LowCheckCount = 0;
		
				//按键按下去了  然后松手 才算按下去1次 
				if(Power_Key_State.Key_Pressed_Flag){
					Power_Key_State.Key_Pressed_Flag = false;	//标记置为无效 
					
					//按下  并松开3次  才进入IAP模式 
					Power_Key_State.Key_Pressed_Times++;
					if(Power_Key_State.Key_Pressed_Times >= 3){
						     //检测USB插上才进入升级模式
							if(ChargingState_Get()){
					//		if(GlobalVar.API_Led_Control_Init_Finish != true)
								API_Led_Control_Init();							//灯控初始化
							Power_Key_State.Key_Pressed_Times = 0;						
							Matchine_3V3_Power_On();					//打开3V3电源 						
							MyPrintf("READY IAP\n");					
							Power_Key_State.WorkMode = GOTO_DFU;
							Power_Key_State.CheckFinished = false;		//进入dfu模式 
							Power_Key_State.ProgramExecute = true;						
							Led_State = LED_INDFU;						//LED以dfu方式闪 
						}
//								else{
//							Power_Key_State.Key_Pressed_Times = 0;
//							Led_State = LED_IDLE;
//							Power_Key_State.CheckFinished = false;
//							Power_Key_State.ProgramExecute = false;
//							Power_Key_State.WorkMode = GOTO_NONE;
//						}
						
					}
				}
//				else if(Power_Key_State.LowCheckCount >= 200){
//					
//					Power_Key_State.Key_Pressed_Times = 0;
//					Power_Key_State.LowCheckCount = 0;
					Power_Key_State.WorkMode = GOTO_NONE;
//					if(Led_State != LED_INDFU)
//						Led_State = LED_IDLE;
//					Power_Key_State.CheckFinished = false;		//进入dfu模式 
//					Power_Key_State.ProgramExecute = true;		
//					
//				}					
				
			}
			return;
		} 
	}
	//关机条件判断(允许关机)
//	if(Power_Key_State.PowerOffCheckStart){
//		//检测IO状态  高电平表示按键按下  低电平未按下 
//		if(SET == POWER_KEY_PRESS_STATE)
//		{
//			if(Power_Key_State.PowerOffKeyRelease)
//			{
//				//长按2S关机 
//				Power_Key_State.LowCheckCount=0;	
//				Power_Key_State.HighCheckCount++;
//				if(Power_Key_State.HighCheckCount >= TIMEOUT_KEY_DITHER){
//					Power_Key_State.HighCheckCount = 0;
//					Power_Key_State.Power_On_Key_Release_Prepare_Flag = true;
//					
//					Power_Key_State.PowerOffKeyRelease = false;		//松开标记置为无效  
//					
//					//如果检测到松开按键后  再按一下 就关机了 
//					Matchine_3V3_Power_Off();						//3V3电源默认关掉 
//					
//					Led_State = LED_IDLE;						//LED以dfu方式闪 
//					
//					MyPrintf("POERT OFF\n");	
//					
//				}
//			}
//		}
//		else		//先检测有无松开  松开后   再按按键才关机 (防止长按导致开机关机反复) 
//		{
//			Power_Key_State.PowerOffKeyRelease = true;		//松按键 

//			if(Power_Key_State.Power_On_Key_Release_Prepare_Flag)
//			{
//				Power_Key_State.Power_On_Key_Release_Prepare_Flag = false;
//			}				
//		}
//	}		
}





























//            api_power_control.h

/******************************************************************************
版权所有:  深圳。。科技有限公司  
文件名:    api_power_control.h
作者:      wangdy  
创建日期:  2020/7/9
描述:      电源控制  
其它:      
修改历史:  //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
            序号    修改时间    修改人  修改内容
			????    ????/??/??  ??????  参考样式       
******************************************************************************/

/*********************************防止多次编译*********************************/

#ifndef _API_POWER_CONTROL
#define _API_POWER_CONTROL

/************************************头文件************************************/
#include <stdint.h>
#include <stdbool.h>

/************************************宏定义************************************/

#define  	ADC_AVERAGE_COUNT        100     

//正常开机 
#define     TIMEOUT_POWER_ON					2000		//按键保持按该段时间  则正常开机  

//IAP超时没进入  则掉3V3电源 
#define 	TIMEOUT_IAP							10000		//超过这么长时间 还没进入IAP 则关机 

//消抖动  
#define    	TIMES_GOTO_DFU						3			//短按3次  则进入iap模式  
#define 	TIMEOUT_KEY_DITHER					20			//20ms消抖动 

//电池温度检测 
#define 	BATTERY_TEMPER_CHECK_ENABLE_FLAG    1  			//允许

#define BATTERY_HIGH_TEMPERATURE_THRESHOLD   	  95   //电池高温阈值
#define PRINTING_BAT_HIGH_TEMPERATURE_THRESHOLD   40   //打印过程电池高温阈值

#define BATTERY_LOW_TEMPERATURE_THRESHOLD   	  475  //电池低温阈值

#define BAT_HIGH_TEMPERATURE_RECOVER_THRESHOLD    150   //电池高温恢复正常的阈值
#define BAT_LOW_TEMPERATURE_RECOVER_THRESHOLD     400   //电池低温恢复正常的阈值
#define BAT_TEMPERATURE_CHECK_TIMES               200	//电池温度状态检测次数(连续检测到这么多次才置状态)

//电池温度检测 
typedef enum{
	BATTERY_TEMP_NORMAL = 0,		//电池温度正常 
	BATTERY_TEMP_OVER_HIGH = 1,	//电池温度过高 
	BATTERY_TEMP_OVER_LOW = 2,	//电池温度过低 
}BATTERY_TEMP_STATE;


/************************************结构体************************************/

//工作模式 
typedef enum
{
	GOTO_NONE,
	GOTO_APP = 1,						//进入APP
	GOTO_DFU,							//进入DFU
}_WORK_MODE;

//充电状态信息 
typedef struct
{
	bool    ChargeControl_Flag;				//充电控制  
	bool    Charging_Flag;					//正在充电状态 
	bool    ChargeFinish_Flag;				//充电完成状态  
}_CHARGE_CONTROL_STATE;

//开关信息 
typedef struct
{
	volatile bool		CheckFinished;			//按键检查完成  
	volatile bool		ProgramExecute;			//程序执行标记 
	volatile bool		PowerOffCheckStart;		//关机启动状态  
	volatile bool		PowerOffKeyRelease;		//按键松开标记 
	volatile bool		Power_On_Key_Release_Prepare_Flag;  //按键准备松开标记 
	volatile uint32_t	PowerOffCheckCount;		//关机计数 
	volatile uint32_t	HighCheckCount;			//高电平计数
	volatile uint32_t	LowCheckCount;			//低电平计数
	volatile uint32_t   Key_Pressed_Times;		//按键计数(用于进入iap模式)
	volatile bool		Key_Pressed_Flag;		//按键按下的标记信息 
	volatile uint32_t   IapReadyStartCount;		//准备进去iap的计数信息 
	volatile _WORK_MODE WorkMode;				//要进入的工作模式  
}_POWER_KEY_STATE;

/**********************************可导出变量**********************************/

extern _POWER_KEY_STATE 		Power_Key_State;		//按键状态信息 
extern _CHARGE_CONTROL_STATE    Charge_Control_Flag;	//充电状态信息 
extern BATTERY_TEMP_STATE		Battery_Temp_State;		//电池温度检测 
extern  uint16_t                Power_Bat_Value;  		//电池电量  

/***********************************函数实现***********************************/
void API_Power_Control_Init(void);						//电源初始化信息 

void API_Bat_Charge_OnOff(bool state);					//使能充电功能 

static void Power_Voltage_Check(void);							//电池电量  

void PowerControl_Process();							//充电流程 
void IRQ_Power_Control_Check(void);						//开关机信息检测 

#endif




























//             driver_spi.c     


/******************************************************************************
版权所有:  深圳。。科技有限公司  
文件名:    driver_spi.c 
作者:      wangdy
创建日期:  2020/06/29
描述:      stm32单片机的串口驱动整合,将接收与发送合并至一起,并且不使用DMA发送 
其它:      
修改历史:  //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
            序号    修改时间    修改人  修改内容
			????    ????/??/??  ??????  参考样式       
******************************************************************************/

/************************************头文件************************************/

#include "yc_spi.h"
#include "yc_gpio.h"
#include "driver_spi.h"

/*************************************变量*************************************/

/*************************************函数*************************************/

/*******************************************************************************
* 名称:		SPI1_GPIO_Config       
* 描述:		SPI相关GPIO初始化 
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
static void SPI_Flash_GPIO_Config()
{
	//GPIO复用设置
	GPIO_Config(PORT_SPI_FLASH_CS, PIN_SPI_FLASH_CS, SPID0_NCS);
	GPIO_Config(PORT_SPI_FLASH_MISO, PIN_SPI_FLASH_MISO, SPID0_MISO); 
    GPIO_Config(PORT_SPI_FLASH_MOSI, PIN_SPI_FLASH_MOSI, SPID0_MOSI);
	GPIO_Config(PORT_SPI_FLASH_SCK, PIN_SPI_FLASH_SCK, SPID0_SCK);
}

/*******************************************************************************
* 名称:		SPI_Flash_Basic_Config       
* 描述:		SPI_Flash_Basic_Config 基本控制  
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
static void SPI_Flash_Basic_Config()
{
	SPI_InitTypeDef SPI_InitStruct;
	
    SPI_InitStruct.Mode = SPI_Mode_Master;
    SPI_InitStruct.BaudRatePrescaler = SPI_BaudRatePrescaler_8;
    SPI_InitStruct.CPHA = SPI_CPHA_First_Edge;
    SPI_InitStruct.CPOL = SPI_CPOL_Low;
    SPI_InitStruct.RW_Delay = 33;

    SPI_Init(SPI0, &SPI_InitStruct);	
}


/*******************************************************************************
* 名称:		SPI_Flash_Configure       
* 描述:		SPI flash初始化   
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
void SPI_Flash_Configure(void)
{
	//GPIO复用设置
	SPI_Flash_GPIO_Config();
	SPI_Flash_Basic_Config();

	MyPrintf("spi0 finish\r\n");
}


/*******************************************************************************
* 名称:		SPI_PrintHead_GPIO_Config       
* 描述:		SPI相关GPIO初始化 
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
static void SPI_PrintHead_GPIO_Config(void)
{
	//GPIO复用设置
    GPIO_Config(PORT_SPI_PRINTEHEAD_SCK, PIN_SPI_PRINTEHEAD_SCK, SPID1_SCK);
    GPIO_Config(PORT_SPI_PRINTEHEAD_MOSI, PIN_SPI_PRINTEHEAD_MOSI, SPID1_MOSI);
}

/*******************************************************************************
* 名称:		SPI_PrintHead_Basic_Config       
* 描述:		SPI_PrintHead_Basic_Config 基本控制  
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
static void SPI_PrintHead_Basic_Config(void)
{
	SPI_InitTypeDef SPI_InitStruct;
	
	SPI_InitStruct.Mode = SPI_Mode_Master;
    SPI_InitStruct.BaudRatePrescaler = SPI_BaudRatePrescaler_2;
    SPI_InitStruct.CPHA = SPI_CPHA_Second_Edge;
    SPI_InitStruct.CPOL = SPI_CPOL_Low;
    SPI_InitStruct.RW_Delay = 33;
	
	SPI_Init(SPI1, &SPI_InitStruct);  
	
	MyPrintf("spi1 finish\r\n");	
}


/*******************************************************************************
* 名称:		SPI_PrintHead_Configure       
* 描述:		SPI 打印头初始化   
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
void SPI_PrintHead_Configure(void)
{
	SPI_PrintHead_GPIO_Config(); 
	SPI_PrintHead_Basic_Config();
}

































//    driver_spi.h


/******************************************************************************
版权所有:  深圳普实科技有限公司  
文件名:    driver_spi.h  
作者:      wangdy
创建日期:  2021/5/31
描述:      SPI控制 
其它:      
修改历史:  //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
            序号    修改时间    修改人  修改内容
			????    ????/??/??  ??????  参考样式       
******************************************************************************/

/*********************************防止多次编译*********************************/
#ifndef _DRIVER_SPI_H
#define _DRIVER_SPI_H

/************************************头文件************************************/
#include <stdint.h>
#include <stdbool.h>


/************************************宏定义************************************/

//-----SPI-FLASH----------------------------------------------------------

//FLASH-SPI-SCK
#define   PIN_SPI_FLASH_SCK					GPIO_Pin_2
#define   PORT_SPI_FLASH_SCK				GPIOC
//FLASH-SPI-MISO
#define   PIN_SPI_FLASH_MISO				GPIO_Pin_5
#define   PORT_SPI_FLASH_MISO				GPIOC
//FLASH-SPI-CS
#define   PIN_SPI_FLASH_CS					GPIO_Pin_4
#define   PORT_SPI_FLASH_CS					GPIOC
//FLASH-SPI-MOSI
#define   PIN_SPI_FLASH_MOSI				GPIO_Pin_3
#define   PORT_SPI_FLASH_MOSI				GPIOC

//-----SPI-打印头----------------------------------------------------------

#if 1

//PRINTEHEAD-SPI-MOSI
#define   PIN_SPI_PRINTEHEAD_MOSI			GPIO_Pin_13
#define   PORT_SPI_PRINTEHEAD_MOSI			GPIOB
//PRINTEHEAD-SPI-SCK
#define   PIN_SPI_PRINTEHEAD_SCK			GPIO_Pin_14
#define   PORT_SPI_PRINTEHEAD_SCK			GPIOB

#else 
//PRINTEHEAD-SPI-MOSI
#define   PIN_SPI_PRINTEHEAD_MOSI			GPIO_Pin_14
#define   PORT_SPI_PRINTEHEAD_MOSI			GPIOB
//PRINTEHEAD-SPI-SCK
#define   PIN_SPI_PRINTEHEAD_SCK			GPIO_Pin_15
#define   PORT_SPI_PRINTEHEAD_SCK			GPIOB

#endif

/************************************结构体************************************/


/**********************************可导出变量**********************************/


/***********************************函数实现***********************************/
void SPI_Flash_Configure(void);
void SPI_PrintHead_Configure(void);


#endif

























/******************************************************************************
版权所有:  深圳。。科技有限公司  
文件名:    main.c  
作者:      wangdy  
创建日期:  20216/2
描述:      主入口函数  
其它:      
修改历史:  //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
            序号    修改时间    修改人  修改内容
			????    ????/??/??  ??????  参考样式       
******************************************************************************/

/************************************头文件************************************/

#include "yc3121.h"
#include "yc_gpio.h"
#include "yc_uart.h"
#include "yc_ipc.h"
#include "usb_main.h"
#include "halUSB.h"
#include "yc_qspi.h"
#include "yc_encflash_bulk.h"
#include "ota_ble.h"
#include "yc_bt.h"
#include "yc_systick.h"
#include "yc_qspi.h"
#include "otausb.h"
#include "printerConfig.h"
#include "driver_uart0.h"
#include "var_global.h"
#include "api_power_control.h"
#include "yc_chrg.h"
#include "api_iap_process.h"
#include "api_iap_flash_opt.h"
#include "api_led_watchdog.h"
#include "bsp_charge_control.h"
#include "bsp_power_control.h"
#include "bsp_print_control.h"
#include "driver_adc.h"


/************************************变量************************************/

extern _Bool  bBacktoAppFlag;

/************************************函数************************************/

/*******************************************************************************
* 名称:		Flash_GetFlag       
* 描述:		获取到升级标记信息 
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
static void Flash_GetFlag(void)
{
	uint8_t  rx_buffer_boot[32] = {0};
	
    enc_read_flash(FLASH_SYSTEM_CONFIG, rx_buffer_boot, 32);
    delay_ms(10);
}

/*******************************************************************************
* 名称:		Erase_App       
* 描述:		清除APP 
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
static void Erase_App(void)
{
//	enc_write_flash_bulk_init();
	enc_earse_flash_app_area(APPWRITEADDR, FLASH_APP_SIZE);

	MyPrintf("USB HID OTA Demo !\n\n");
}

/*******************************************************************************
* 名称:		Update_USB       
* 描述:		USB固件升级  
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
static void Update_USB(void)
{
	/*USB OTA 0xAA55AA55*/
	IpcInit();
	halUsbInit(USB_MODE_HID);
}

/*******************************************************************************
* 名称:		main       
* 描述:		主入口函数  
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
int main(void)
{
	//delay_ms(50);
    SYSCTRL_HCLKConfig(SYSCTRL_HCLK_Div_None);		//默认配置不分频 

	UART0_Configuration(UART0_BAUD);
	
	API_Power_Control_Init();						//电源控制	
	Print_Control_Init();							//打印头部分引脚控制 及电机使能控制  
	API_Led_Control_Init();							//灯控初始化
	
	SysTick_Config(CPU_MHZ/1000);					//systick  1ms 
	
	//如果插入usb 则初始化adc 否则不初始化 
	if(ChargingState_Get()){
		ADC_Configure();							//adc初始化 
	}
	
//	MyPrintf("ready init\n");
	
	while (1)
	{
		
		PowerControl_Process();						//电源状态检测 		
		//看有没有检测完成  未检测完成则不做处理  
//		MyPrintf("Power_Key_State= %d \n",Power_Key_State.ProgramExecute);
		if(Power_Key_State.ProgramExecute)
		{
			Power_Key_State.ProgramExecute = false;		//只进来一次 
			
			if(Power_Key_State.WorkMode == GOTO_APP)
			{
				MyPrintf("GOTO_APP\n");
				Proc_BootLoader();			/*执行升级过程				*/
			}
			if(Power_Key_State.WorkMode == GOTO_DFU)   //短按3次按键USB升级固件时执行
			{
				MyPrintf("GOTO_DFU\n");
				//USB初始化
				Update_USB();
				//擦除整个备份区内数据 
				Iap_BackDataEraseAll();			
				//允许关机 
				Power_Key_State.PowerOffCheckStart = true;        //已经开机的标志
				//第一次  初始化完成了 
				GlobalVar.Update_Finish_Init_Finish = true;
				
			}
		}
		//初始化完成 后  
		if(GlobalVar.Update_Finish_Init_Finish)
		{
			Cmd_check();
			BackToApp(bBacktoAppFlag);		//擦除 只擦一次 
			if(ChargingState_Get() == false){
				Power_Key_State.WorkMode = GOTO_NONE;
			}
		}
	}
}


























//                    driver_adc.c






/******************************************************************************
版权所有: 	深圳。。科技有限公司   
文件名:    driver_adc.c
作者:      wangdy
创建日期:  2021/5/31
描述:      adc驱动接口 
其它:      
修改历史:  //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
            序号    修改时间    修改人  修改内容
			????    ????/??/??  ??????  参考样式       
******************************************************************************/

/************************************头文件************************************/

#include "driver_adc.h"
#include "yc_adc.h"
#include <string.h>

/*************************************变量*************************************/

_ADC_CHANNEL_VALUE  adc_channel_value = {0};

/*************************************函数*************************************/

/*******************************************************************************
* 名称:		ADC_Configure       
* 描述:		ADC初始化     
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
void ADC_Configure(void)
{
	ADC_GPIO_Config();
	ADC_Basic_Config();
}

/*******************************************************************************
* 名称:		ADC_GPIO_Config       
* 描述:		ADC相关GPIO初始化 
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
void ADC_GPIO_Config()
{ 
	//bat 
	GPIO_Config(PORT_BAT_POWER_CHECK, PIN_BAT_POWER_CHECK, ANALOG);
	//ntc 
	GPIO_Config(PORT_BATTERY_TEMPER_NTC_TEMP_CHECK, PIN_BATTERY_TEMPER_NTC_TEMP_CHECK, ANALOG);  
}

/*******************************************************************************
* 名称:		ADC_Basic_Config       
* 描述:		ADC 基本初始化 
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
void ADC_Basic_Config(void)
{
	ADC_InitTypeDef ADCInitStruct;
	
	//bat
    ADCInitStruct.ADC_Channel = ADC_CHANNEL_BAT_POWER_CHECK;
    ADCInitStruct.ADC_Mode = ADC_GPIO;
    ADC_Init(&ADCInitStruct);
	
	//ntc
    ADCInitStruct.ADC_Channel = ADC_CHANNEL_BATTERY_TEMPER_NTC_TEMP_CHECK;
    ADCInitStruct.ADC_Mode = ADC_GPIO;
    ADC_Init(&ADCInitStruct);
}

/*******************************************************************************
* 名称:		ADC_Get_Value       
* 描述:		ADC 值获取 
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
int ADC_Get_Value(ADCChannelTypeEnum channel)
{
	switch(channel)
	{
		case ADC_BAT_POWER:
		{
			adc_channel_value.adc_data.Power_Bat_Value = ADC_GetVoltage(ADC_CHANNEL_BAT_POWER_CHECK);
			return adc_channel_value.adc_data.Power_Bat_Value;
			break;
		}
		case ADC_BATTERY_NTC_TEMP:		
		{
			adc_channel_value.adc_data.Battery_NTC_Value = ADC_GetVoltage(ADC_CHANNEL_BATTERY_TEMPER_NTC_TEMP_CHECK);
			return adc_channel_value.adc_data.Battery_NTC_Value;
			break;
		}
		default:
		{
			return 0;
			break;
		}
	}
}

/*******************************************************************************
* 名称:		ADC_Get_SlowValue       
* 描述:		ADC 获取慢速信息 
* 输入参数:	无 
* 输出参数:	无   
* 其它:		无   
*******************************************************************************/
int ADC_Get_SlowValue(ADCChannelTypeEnum channel)
{
	switch(channel)
	{
		case ADC_BAT_POWER:
		{
			adc_channel_value.adc_data.Power_Bat_Value = ADC_GetVoltage(ADC_CHANNEL_BAT_POWER_CHECK);
			return adc_channel_value.adc_data.Power_Bat_Value;
			break;
		}
		case ADC_BATTERY_NTC_TEMP:		
		{
			adc_channel_value.adc_data.Battery_NTC_Value = ADC_GetVoltage(ADC_CHANNEL_BATTERY_TEMPER_NTC_TEMP_CHECK);
			return adc_channel_value.adc_data.Battery_NTC_Value;
			break;
		}
		default:
		{
			return 0;
			break;
		}
	}
}





























//                      




/******************************************************************************
版权所有: 	深圳..科技有限公司   
文件名:    driver_adc.h
作者:      wangdy
创建日期:  2021/5/31
描述:      adc驱动 
其它:      
修改历史:  //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
            序号    修改时间    修改人  修改内容
			????    ????/??/??  ??????  参考样式       
******************************************************************************/

/*********************************防止多次编译*********************************/
#ifndef _DRIVER_ADC_H
#define _DRIVER_ADC_H

/************************************头文件************************************/
#include <stdint.h>
#include <stdbool.h>
#include "yc_adc.h"

/************************************宏定义************************************/

#define   ADC_CHANNEL_NUM																2		


//BAT-CHECK
#define   PIN_BAT_POWER_CHECK										GPIO_Pin_9
#define   PORT_BAT_POWER_CHECK										GPIOC
#define   ADC_CHANNEL_BAT_POWER_CHECK   							ADC_CHANNEL_4

//PRINTER-NTC-CHECK
#define   PIN_BATTERY_TEMPER_NTC_TEMP_CHECK							GPIO_Pin_6
#define   PORT_BATTERY_TEMPER_NTC_TEMP_CHECK						GPIOC
#define   ADC_CHANNEL_BATTERY_TEMPER_NTC_TEMP_CHECK    				ADC_CHANNEL_1
			

/************************************结构体************************************/

//确定读哪路ADC 
typedef enum
{
	ADC_BAT_POWER,		
	ADC_BATTERY_NTC_TEMP,		
}ADCChannelTypeEnum;

#pragma pack(push)
#pragma pack(1)

typedef union
{
	uint16_t  adc_buf[ADC_CHANNEL_NUM];
	
    struct _ADC_CHANNEL_DATA
	{
		uint16_t Power_Bat_Value;
		uint16_t Battery_NTC_Value;					//电池ntc温度ad 
	}adc_data;
}_ADC_CHANNEL_VALUE;

#pragma pack(pop)


/**********************************可导出变量**********************************/

extern _ADC_CHANNEL_VALUE  adc_channel_value;

/***********************************函数实现***********************************/
void ADC_Configure(void);
void ADC_GPIO_Config(void);
void ADC_Basic_Config(void);
int  ADC_Get_Value(ADCChannelTypeEnum channel);
int  ADC_Get_SlowValue(ADCChannelTypeEnum channel);		//获取慢速信息 

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值