找回密码
 立即注册
查看: 620|回复: 9

CDC串口初始化时如果没有插USB线,程序无法继续

[复制链接]
  • TA的每日心情
    开心
    前天 15:03
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    35

    主题

    87

    回帖

    765

    积分

    高级会员

    积分
    765
    发表于 2023-6-1 10:22:43 | 显示全部楼层 |阅读模式
    本帖最后由 沈洁 于 2023-6-1 13:43 编辑

    如果没有插入USB线,下位机开机后一直等待。插入USB线后才完成初始化状态。可是下位机有时需要单机使用,不连接USB端口。如何处理?

    回复 送花

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 09:14
  • 签到天数: 135 天

    [LV.7]常住居民III

    8

    主题

    79

    回帖

    1098

    积分

    金牌会员

    机长

    积分
    1098
    发表于 2023-6-1 10:26:42 | 显示全部楼层
    代码贴出来看看?感觉你是在main里面死等CDC初始化了?
    业余撸代码,专业开飞机
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-8 13:27
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    14

    主题

    67

    回帖

    431

    积分

    荣誉版主

    积分
    431
    发表于 2023-6-1 13:43:18 | 显示全部楼层
    做延时跳出程序啊
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 15:03
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    35

    主题

    87

    回帖

    765

    积分

    高级会员

    积分
    765
     楼主| 发表于 2023-6-1 14:43:20 | 显示全部楼层
    主程序如下
    void sysu_init();                                    //声明系统基本初始化函数,包括USB初始化

    define  FOSC   24000000UL                            //ISP下载时, 需要将工作频率IRC设置为 24MHz。

    char *USER_DEVICEDESC = NULL ;
    char *USER_PRODUCTDESC = NULL ;
    char *USER_STCISPCMD = "@STCISP#" ;                   //不停电ISP自动下载命令

    void main(void)  //主函数
    {
        cta_ini() ;                                       //除了CDC相关的其它系统初始化语句
        sysu_init();                                      //USB的CDC初始化程序

        while(1)                                       //死循环
        {
            其他执行语句
        }
    }

    void sysu_init()                                           //系统初始化
    {
        P_SW2 |= 0x81 ;                                        //允许访问XFR

        P0M1 = 0x00;   P0M0 = 0x00;                            //设置为准双向口。00准双向;01推挽输出;10高阻输入;11开漏输出
        P1M1 = 0x00;   P1M0 = 0x00;                            //设置为准双向口
        P2M1 = 0x00;   P2M0 = 0x00;                            //设置为准双向口
        P3M1 = 0x00;   P3M0 = 0x00;                            //设置为准双向口
        P4M1 = 0x00;   P4M0 = 0x00;                            //设置为准双向口
        P5M1 = 0x00;   P5M0 = 0x00;                            //设置为准双向口
        P6M1 = 0x00;   P6M0 = 0x00;                            //设置为准双向口
        P7M1 = 0x00;   P7M0 = 0x00;                            //设置为准双向口

        P3M0 &=~0x03 ;                                         //P3.0/P3.1与USB的D-/D+共用引脚
        P3M1 |= 0x03 ;                                         //需要将P3.0/P3.1设置为高阻模式。  
       
        IRC48MCR = 0x80;                                       //内部48MHz震荡器控制寄存器。使能内部48M的USB专用IRC。第1位是振荡器稳定标志位。
        while (!(IRC48MCR & 0x01));                            //等待振荡器稳定
        USBCLK = 0x00;                                         //设置USB时钟源为内部48MHz的USB专用IRC
        USBCON = 0x90;                                         //使能USB功能
        usb_init();                                            //调用USB CDC初始化库函数
        IE2 |= 0x80;                                           //使能USB中断
        EA = 1;                                                //打开总中断
            while (DeviceState != DEVSTATE_CONFIGURED);            //等待USB完成配置
    }

    去掉sysu_init(); 就是我们原来的程序。再就是加入了STC的中断CDC库文件。
    也就是增加了这一块,USB线就需要插入PC的USB口,否则上电时就停止。初始化结束后,拔下USB线程序可以运行(暂时不使用CDC串口),但是复位后初始化又陷入等待,需要再插入USB线。
    去掉sysu_init();,就没有这个问题了。当然也没有CDC串口了。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1343

    回帖

    4187

    积分

    论坛元老

    积分
    4187
    发表于 2023-6-1 14:51:47 | 显示全部楼层
    while (DeviceState != DEVSTATE_CONFIGURED);            //等待USB完成配置
    这条指令导致程序一直在等待USB完成配置。
    可以在USB通信相关程序前面加判断,USB没有完成配置就退出,其它代码照常执行。

    点评

    这句话就是会咬死的,所以正常的是需要给等待加一个时间,超时就跳出,能理解吗  详情 回复 发表于 2023-6-2 10:54
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 09:14
  • 签到天数: 135 天

    [LV.7]常住居民III

    8

    主题

    79

    回帖

    1098

    积分

    金牌会员

    机长

    积分
    1098
    发表于 2023-6-1 16:45:59 | 显示全部楼层
    lgwd 发表于 2023-6-1 14:43
    主程序如下
    void sysu_init();                                    //声明系统基本初始化函数,包括USB初 ...
    while (DeviceState != DEVSTATE_CONFIGURED);

    果然和我猜的一毛一样,在死等CDC初始化完成~
    业余撸代码,专业开飞机
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 15:03
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    35

    主题

    87

    回帖

    765

    积分

    高级会员

    积分
    765
     楼主| 发表于 2023-6-1 20:10:23 | 显示全部楼层
    如果STC的CDC初始化程序自身没有超时判断,那就只能用户外加定时判断。因为我们的下位机今天也许要联机操作,或许明日需要单机操作,传统串口不需要判定。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3044

    回帖

    6863

    积分

    超级版主

    积分
    6863
    发表于 2023-6-1 21:59:18 | 显示全部楼层
    增加超时处理。例子为了简单,不加处理。
    实际项目,不管程序有多复杂,我任何地方都不会有死等的情况,也不要经常执行几十us以上的软件延时,可以采取的方法有:超时处理(软件定时器),时隙驱动,状态机查询,或者RTOS。
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-8 13:27
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    14

    主题

    67

    回帖

    431

    积分

    荣誉版主

    积分
    431
    发表于 2023-6-2 10:54:41 | 显示全部楼层
    乘风飞扬 发表于 2023-6-1 14:51
    while (DeviceState != DEVSTATE_CONFIGURED);            //等待USB完成配置
    这条指令导致程序一直在等待U ...

    这句话就是会咬死的,所以正常的是需要给等待加一个时间,超时就跳出,能理解吗
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 15:03
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    35

    主题

    87

    回帖

    765

    积分

    高级会员

    积分
    765
     楼主| 发表于 2023-6-2 12:32:45 | 显示全部楼层
    我们系统中T0定时器中断是最高等级。T0中断服务程序中已经设置了一个防死操作变量。现在就用它在上述语句中再增加一个等待时间判定条件,与“DeviceState != DEVSTATE_CONFIGURED”是“&&”的关系,容易解决。之前只是想既然使用STC的官方操作,看官方有什么标准操作方法。谢谢大家回复!
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-20 04:57 , Processed in 0.069736 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表