之前做遥控手柄时,使用usb hid烧录的,不是用串口,也就是说无法用串口打印信息,不方便调试代码,于是,写了一个STC8_USBCDC模拟串口收发数据的代码。
百度网盘链接:https://pan.baidu.com/s/1AXd4zsaQSt7vYXetngYn1w?pwd=k89q
#ifndef __STC8_USB_CDC_H__
#define __STC8_USB_CDC_H__
#include "stc32_stc8_usb.h"
#include "Config.h"
void usb_cdc_init();
void usb_handle();
#endif
#include "stc8_usb_cdc.h"
char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令
void usb_cdc_init() {
//扩展寄存器(XFR)访问使能
P_SW2 |= 0x80;
// P30 P31准双向
P3M0 &= ~0x03; P3M1 &= ~0x03;
IRC48MCR = 0x80; //使能内部 48M 的 USB 专用 IRC
while (!(IRC48MCR & 0x01)); // 等待时钟稳定
usb_init(); //调用 USB CDC 初始化库函数
USBCLK = 0x00; //设置 USB 时钟源为内部 48M 的 USB 专用 IRC
USBCON = 0x90; //使能 USB 功能
IE2 |= 0x80; //使能 USB 中断
EA = 1;
//等待USB完成配置
while (DeviceState != DEVSTATE_CONFIGURED);
}
void usb_handle() {
//当接收完成数据后,bUsbOutReady置1
//接收字节数保存在OutNumber中
//接收数据保存在UsbOutBuffer缓冲区
if(bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //向上位机发送数据
usb_OUT_done(); //处理完成接收的数据后调用该函数接收下一个数据
}
}
#include "stc8_usb_cdc.h"
#include "Delay.h"
void main() {
//扩展寄存器(XFR)访问使能
P_SW2 |= 0x80;
usb_cdc_init();
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
printf("hello usb cdc\n");
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
printf("num = %d\n", (int)250);
while(1) {
usb_handle(); // 回显接收的数据
delay_ms(250);
}
}