184 lines
5.0 KiB
C
184 lines
5.0 KiB
C
|
|
#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>1λ
|
|||
|
|
0x00, //У<><D0A3>λ,Ĭ<><C4AC><EFBFBD><EFBFBD>
|
|||
|
|
0x08 //<2F><><EFBFBD><EFBFBD>λ,Ĭ<><C4AC>8λ
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
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);
|
|||
|
|
}
|
|||
|
|
|