pursuing 发表于 2024-2-25 09:40:23

看门狗中关于USB复位代码中的延时函数的疑惑

我在学习冲哥的STC32教程,由于我使用的是STC8H8K64U实验箱,所以使用USB-CDC时,我的例程中代码略有不同,如下是实验成功的:

void main(){
        ...
        IRC48MCR = 0x80; //使能内部 48M 的 USB 专用 IRC
        while (!(IRC48MCR & 0x01));
        USBCLK = 0x00;//设置 USB 时钟源为内部 48M 的 USB 专用 IRC
        USBCON = 0x90;//使能 USB 功能
        usb_init();

        IE2 |= 0x80;   // 使能 USB 中断
        EA = 1;      
        while (DeviceState != DEVSTATE_CONFIGURED); // 等待 USB 完成配置

        while(1){
                if (bUsbOutReady){                
                        USB_SendData(UsbOutBuffer,OutNumber);
                        usb_OUT_done(); //处理完成接收的数据后,调用 usb_OUT_done 准备接收下一笔数据
                }
        ......
}

但在学习第23课看门狗中,冲哥介绍了 USB复位代码的4句:

        USBCON = 0X00;
        USBCLK = 0X00;
        IRC48MCR = 0X00;
        delay_ms(10);

现在我把如上4句放到前面程序的...处,看门狗运行正常。我的疑问是,这几句写在前面,后面紧跟的几句赋值(USBCON、IRC48MCR等)不就覆盖了吗?为什么还是有效的?经实验,没有这4句,看门狗就是不行。而且这个延时10ms也非常重要,如果把这句注释掉的话,看门狗也不能正常。哪位高手能解释一下,为何有了这个延时,后面再次赋值就不起作用了?谢谢!


电子DIY小家 发表于 2024-2-26 08:30:58

你可以这样理解:因为这个USB在单片机端是作为从机的, USBCON = 0X00;USBCLK = 0X00;IRC48MCR = 0X00;这三句是为了让USB恢复初始化,但是这里只是让从机端初始化,本质上这里不能直接控制主机,但是主机会时不时的去轮询从机,所以给他点延时让主机查到信号即可。所以如果之前主机端已经识别并检测到了这个USB从机之后,就需要加上这四句从新连接下。

pursuing 发表于 2024-2-26 09:29:15

电子DIY小家 发表于 2024-2-26 08:30
你可以这样理解:因为这个USB在单片机端是作为从机的, USBCON = 0X00;USBCLK = 0X00;IRC48MCR = 0X00;这三 ...

谢谢冲哥讲解,我再学习了USB后,相信会加深理解。{:victory:}
页: [1]
查看完整版本: 看门狗中关于USB复位代码中的延时函数的疑惑