// 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
U20-0418差异文件_22
于 2024-04-18 09:51:54 首次发布