只引出P3.0,P3.1,想要把printf()打印的信息通过USB传到电脑?
本帖最后由 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
本帖最后由 zhangzhonghua 于 2023-12-28 16:48 编辑
以上USB代码和printf()打印语句注释掉的话,按键怎么按,屏幕都是正常的。
以前使用UART串口,好像没有这么多问题。这次想着换上USB试试,没想到遇到这么多问题。
问题是USB还只有库没有源码,怎么一步步来定位问题啊?
另外一个信息,按键检测、键名printf()是在main()函数下层里面做的。
我请内部来回答下 神农鼎 发表于 2023-12-28 17:05
我就是看到这个宣传,说从UART转USB试试,但现在遇到问题,怎么逐步来定位解决啊? 本帖最后由 乘风飞扬 于 2023-12-28 18:01 编辑
zhangzhonghua 发表于 2023-12-28 17:10
我就是看到这个宣传,说从UART转USB试试,但现在遇到问题,怎么逐步来定位解决啊? ...使用附件例程试试,按一次按键打印一次信息,例程使用P3.2,P3.3口按键
本帖最后由 zhangzhonghua 于 2023-12-28 19:21 编辑
1、解压文件,一眼注意到USB库的日期比我手头的新。
2、下载例程到板上运行,打开串口,按按键,有打印。
3、把该新USB库替换到我的project里,重新编译,下载运行,测试,目前再无屏幕不动的现象、也没有感觉阻塞的现象。
结论:
旧的库文件有问题:stc_usb_cdc_8h_xdata.LIB,43,925 字节,修改时间 2022年11月11日,13:48:20
新的库文件正常:stc_usb_cdc_8h_xdata.LIB,44,129 字节,修改时间 2023年6月30日,18:17:21
还剩个问题请教:使用STC-USB Link1D工具,打开CDC1串口,按按键,电脑串口是没打印的;但是,去掉STC-USB Link1D工具,USB-TypeC直接连接到电脑,打开串口,按按键,电脑串口是有打印的。这个是什么原因?
zhangzhonghua 发表于 2023-12-28 19:19
1、解压文件,一眼注意到USB库的日期比我手头的新。
2、下载例程到板上运行,打开串口,按按键,有打印。
3 ...
使用STC-USB Link1D工具的CDC1串口与芯片通信的话,芯片需要配置成UART串口与工具通信;
而例程是将芯片本身配置为USB CDC串口,所以只要使用USB线连接电脑即可,不需要其它串口工具。