zhangzhonghua 发表于 2023-12-28 16:31:41

只引出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:40:33

本帖最后由 zhangzhonghua 于 2023-12-28 16:48 编辑

以上USB代码和printf()打印语句注释掉的话,按键怎么按,屏幕都是正常的。
以前使用UART串口,好像没有这么多问题。这次想着换上USB试试,没想到遇到这么多问题。

问题是USB还只有库没有源码,怎么一步步来定位问题啊?

zhangzhonghua 发表于 2023-12-28 16:51:40

另外一个信息,按键检测、键名printf()是在main()函数下层里面做的。

神农鼎 发表于 2023-12-28 17:05:39





神农鼎 发表于 2023-12-28 17:06:16


神农鼎 发表于 2023-12-28 17:07:48

我请内部来回答下

zhangzhonghua 发表于 2023-12-28 17:10:02

神农鼎 发表于 2023-12-28 17:05


我就是看到这个宣传,说从UART转USB试试,但现在遇到问题,怎么逐步来定位解决啊?

乘风飞扬 发表于 2023-12-28 17:59:34

本帖最后由 乘风飞扬 于 2023-12-28 18:01 编辑

zhangzhonghua 发表于 2023-12-28 17:10
我就是看到这个宣传,说从UART转USB试试,但现在遇到问题,怎么逐步来定位解决啊? ...使用附件例程试试,按一次按键打印一次信息,例程使用P3.2,P3.3口按键

zhangzhonghua 发表于 2023-12-28 19:19:52

本帖最后由 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直接连接到电脑,打开串口,按按键,电脑串口是有打印的。这个是什么原因?

乘风飞扬 发表于 2023-12-29 10:06:30

zhangzhonghua 发表于 2023-12-28 19:19
1、解压文件,一眼注意到USB库的日期比我手头的新。
2、下载例程到板上运行,打开串口,按按键,有打印。
3 ...

使用STC-USB Link1D工具的CDC1串口与芯片通信的话,芯片需要配置成UART串口与工具通信;
而例程是将芯片本身配置为USB CDC串口,所以只要使用USB线连接电脑即可,不需要其它串口工具。
页: [1] 2 3
查看完整版本: 只引出P3.0,P3.1,想要把printf()打印的信息通过USB传到电脑?