184 lines
5.0 KiB
C
Raw Permalink Normal View History

2021-07-28 13:15:22 +08:00
#include "main.h"
#include "usbd_cdc_interface.h"
#include "string.h"
#include "stdarg.h"
#include "stdio.h"
#include "usart.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
/**************************************************************************/
//usb vcp<63><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/**************************************************************************/
//////////////////////////////////////////////////////////////////////////////////
//USB<53><42><EFBFBD><EFBFBD><E2B4AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
USBD_CDC_LineCodingTypeDef LineCoding=
{
115200, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x00, //ֹͣλ,Ĭ<><C4AC>
0x00, //У<><D0A3>λ,Ĭ<><C4AC><EFBFBD><EFBFBD>
0x08 //<2F><><EFBFBD><EFBFBD>λ,Ĭ<><C4AC>
};
u8 USART_PRINTF_Buffer[USB_USART_REC_LEN]; //usb_printf<74><66><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵķ<DDB5><C4B7><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
u8 USB_USART_RX_BUF[USB_USART_REC_LEN]; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>,<2C><><EFBFBD><EFBFBD>USART_REC_LEN<45><4E><EFBFBD>ֽ<EFBFBD>.
u8 USBRxBuffer[USB_USART_REC_LEN]; //USB<53><42><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>USART_REC_LEN<45><4E><EFBFBD>ֽ<EFBFBD>.
//<2F><><EFBFBD><EFBFBD>״̬
//bit15<31><35> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־
//bit14<31><34> <09><><EFBFBD>յ<EFBFBD>0x0d
//bit13~0<><30> <09><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>Ŀ
u16 USB_USART_RX_STA=0; //<2F><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>
extern USBD_HandleTypeDef USBD_Device;
static int8_t CDC_Itf_Init(void);
static int8_t CDC_Itf_DeInit(void);
static int8_t CDC_Itf_Control(uint8_t cmd, uint8_t * pbuf, uint16_t length);
static int8_t CDC_Itf_Receive(uint8_t * pbuf, uint32_t * Len);
//<2F><><EFBFBD><EFBFBD><E2B4AE><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>(<28><>USB<53>ں˵<DABA><CBB5><EFBFBD>)
USBD_CDC_ItfTypeDef USBD_CDC_fops=
{
CDC_Itf_Init,
CDC_Itf_DeInit,
CDC_Itf_Control,
CDC_Itf_Receive
};
//<2F><>ʼ<EFBFBD><CABC>VCP
//<2F><><EFBFBD><EFBFBD>ֵ:USBD_OK
static int8_t CDC_Itf_Init(void)
{
USBD_CDC_SetRxBuffer(&USBD_Device,USBRxBuffer);
return (USBD_OK);
}
//<2F><>λVCP
//<2F><><EFBFBD><EFBFBD>ֵ:USBD_OK
static int8_t CDC_Itf_DeInit(void)
{
return (USBD_OK);
}
//<2F><><EFBFBD><EFBFBD>VCP<43><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//buf:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBA><EFBFBD><EFBFBD>
//len:<3A><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:USBD_OK
static int8_t CDC_Itf_Control(uint8_t cmd, uint8_t * pbuf, uint16_t length)
{
switch (cmd)
{
case CDC_SEND_ENCAPSULATED_COMMAND:break;
case CDC_GET_ENCAPSULATED_RESPONSE:break;
case CDC_SET_COMM_FEATURE:break;
case CDC_GET_COMM_FEATURE:break;
case CDC_CLEAR_COMM_FEATURE:break;
case CDC_SET_LINE_CODING:
LineCoding.bitrate = (uint32_t) (pbuf[0] | (pbuf[1] << 8) |
(pbuf[2] << 16) | (pbuf[3] << 24));
LineCoding.format = pbuf[4];
LineCoding.paritytype = pbuf[5];
LineCoding.datatype = pbuf[6];
//<2F><>ӡ<EFBFBD><D3A1><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
printf("linecoding.format:%d\r\n",LineCoding.format);
printf("linecoding.paritytype:%d\r\n",LineCoding.paritytype);
printf("linecoding.datatype:%d\r\n",LineCoding.datatype);
printf("linecoding.bitrate:%d\r\n",LineCoding.bitrate);
break;
case CDC_GET_LINE_CODING:
pbuf[0] = (uint8_t) (LineCoding.bitrate);
pbuf[1] = (uint8_t) (LineCoding.bitrate >> 8);
pbuf[2] = (uint8_t) (LineCoding.bitrate >> 16);
pbuf[3] = (uint8_t) (LineCoding.bitrate >> 24);
pbuf[4] = LineCoding.format;
pbuf[5] = LineCoding.paritytype;
pbuf[6] = LineCoding.datatype;
break;
case CDC_SET_CONTROL_LINE_STATE:break;
case CDC_SEND_BREAK:break;
default:break;
}
return (USBD_OK);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//databuffer:<3A><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
//Nb_bytes:<3A><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>.
//<2F><><EFBFBD><EFBFBD>ֵ:USBD_OK
uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len)
{
u8 i;
u8 res;
for(i=0;i<Len;i++)
{
res=Buf[i];
if((USB_USART_RX_STA&0x8000)==0) //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
{
if(USB_USART_RX_STA&0x4000) //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>0x0d
{
if(res!=0x0a)USB_USART_RX_STA=0;//<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>,<2C><><EFBFBD>¿<EFBFBD>ʼ
else USB_USART_RX_STA|=0x8000; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}else //<2F><>û<EFBFBD>յ<EFBFBD>0X0D
{
if(res==0x0d)USB_USART_RX_STA|=0x4000;
else
{
USB_USART_RX_BUF[USB_USART_RX_STA&0X3FFF]=res;
USB_USART_RX_STA++;
if(USB_USART_RX_STA>(USB_USART_REC_LEN-1))USB_USART_RX_STA=0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>,<2C><><EFBFBD>¿<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
}
}
}
}
return USBD_OK;
}
//ͨ<><CDA8>USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//data:Ҫ<><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
//length:<3A><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
void VCP_DataTx(uint8_t *data,uint32_t Len)
{
USBD_CDC_SetTxBuffer(&USBD_Device,data,Len);
USBD_CDC_TransmitPacket(&USBD_Device);
delay_ms(CDC_POLLING_INTERVAL);
}
//usb<73><62><EFBFBD><EFBFBD><E2B4AE>,printf <20><><EFBFBD><EFBFBD>
//ȷ<><C8B7>һ<EFBFBD>η<EFBFBD><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>USB_USART_REC_LEN<45>ֽ<EFBFBD>
void usb_printf(char* fmt,...)
{
u16 i;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART_PRINTF_Buffer,fmt,ap);
va_end(ap);
i=strlen((const char*)USART_PRINTF_Buffer); //<2F>˴η<CBB4><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵij<DDB5><C4B3><EFBFBD>
VCP_DataTx(USART_PRINTF_Buffer,i); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SCB_CleanDCache_by_Addr((uint32_t *)USART_PRINTF_Buffer,i);
}
//CDC<44><43><EFBFBD>ݽ<EFBFBD><DDBD>պ<EFBFBD><D5BA><EFBFBD>
//Buf:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
//Len:<3A><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
static int8_t CDC_Itf_Receive(uint8_t *Buf,uint32_t *Len)
{
SCB_CleanDCache_by_Addr((uint32_t *)Buf,*Len);
USBD_CDC_ReceivePacket(&USBD_Device);
VCP_DataRx(Buf,*Len);
return (USBD_OK);
}