|
本帖最后由 zhangzhonghua 于 2023-12-28 16:35 编辑
只引出P3.0,P3.1,想要把printf()打印的信息通过USB传到电脑?遇到问题了,请教。
芯片STC8H8K64U,只引出P3.0,P3.1接到USB-TypeC座子上,还有P3.2也接到了按键上。使用STC-USB Link1D工具。
软件目前所做的是,按某个按键后,屏幕会有显示,另外把这个键的名字printf()出来,正常的话,电脑串口工具会打印键名出来。
问题:使用STC-USB Link1D工具,只是挂着,没打开CDC1串口,按了几次按键,屏幕就不动了,表明程序异常了。
打开CDC1串口,继续按键,屏幕仍不动,电脑串口也没打印。
逐个排除法,去掉STC-USB Link1D工具,USB-TypeC直接连接到电脑。只是挂着,没打开CDC串口,按了几次按键,屏幕就不动了,表明程序异常了。
但此时打开CDC串口,还没去按键,屏幕就动起来了(难道刚才电脑这边USB不接收,单片机就阻塞了?),继续按键,屏幕正常,电脑串口打印键名正常。
程序里面USB相关的代码,参考 01-跑马灯,15-通过USB CDC协议虚拟串口收发数据 里面的例程。如下,
#define PRINTF_HID //printf输出直接重定向到USB HID接口,放在"usb.h"头文件之前
...
//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令
//P3.2口按键复位所需变量
bit Key_Flag;
u16 Key_cnt;
...
//USB调试及复位所需代码-----
P3M0 &= ~0x03;
P3M1 |= 0x03;
IRC48MCR = 0x80;
while (!(IRC48MCR & 0x01));
USBCLK = 0x00;
USBCON = 0x90;
usb_init();
//-------------------------
...
IE2 |= 0x80; //IE2相关的中断位操作使能后,需要重新设置EUSB
EA = 1; //打开总中断
...
void KeyResetScan(void)
{
...
}
void timer0_int(void) interrupt 1 //1ms 中断函数
{
if (bUsbOutReady) //USB调试及复位所需代码
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试HID)
usb_OUT_done();
}
KeyResetScan(); //P3.2口按键触发软件复位,进入USB下载模式,不需要此功能可删除本行代码
...
}
USB库使用的是 stc_usb_cdc_8h_xdata.LIB,43,925 字节,修改时间 2022年11月11日,13:48:20
|
|