找回密码
 立即注册
查看: 46|回复: 2

关于stc32G芯片USB状态无法识别的问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-04-30 10:08:14

1

主题

1

回帖

9

积分

新手上路

积分
9
发表于 6 天前 来自手机 | 显示全部楼层 |阅读模式
请问通过软件怎么判断USB拔掉了?
芯片STC32G12K128
库stc_usb_cdc_32g.lib
现在的状态:上电第1次USB插上的时候,USB的状态检测 DeviceState == DEVSTATE_CONFIGURED 时USB连接并完成了配置,可以正常检测。

但是当USB拔掉之后,这个状态不会变,无法判断USB是否拔掉了。

再次插上USB时DeviceState的状态才会发生一次变化。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2026-04-30 08:53:57
已绑定手机

106

主题

4345

回帖

9748

积分

荣誉版主

无情的代码机器

积分
9748
发表于 5 天前 | 显示全部楼层
可以读取FRAME1帧号,长时间不变视为USB拔出后。
extern BYTE usb_read_reg(BYTE addr);
usb_read_reg(FRAME1)


还有个办法是自己主动设置ENSUS,使能挂起检测,然后查询POWER寄存器USBSUS状态,拔出会置位0x03
截图202604262132201406.jpg
截图202604262134071028.jpg

  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用户文件头说明信息  
  4. // 文件名称: main.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改记录:
  8. //   1. (2026-04-26) 创建文件
  9. ////////////////////////////////////////
  10. //<<AICUBE_USER_HEADER_REMARK_END>>
  11. #include "config.h"                     //默认已包含stdio.h、intrins.h等头文件
  12. //<<AICUBE_USER_INCLUDE_BEGIN>>
  13. // 在此添加用户头文件包含  
  14. //<<AICUBE_USER_INCLUDE_END>>
  15. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  16. // 在此添加用户全局变量定义、用户宏定义以及函数声明  
  17. extern BYTE usb_read_reg(BYTE addr);
  18. extern void usb_write_reg(BYTE addr, BYTE dat);
  19. //<<AICUBE_USER_GLOBAL_DEFINE_END>>
  20. ////////////////////////////////////////
  21. // 项目主函数
  22. // 入口参数: 无
  23. // 函数返回: 无
  24. ////////////////////////////////////////
  25. void main(void)
  26. {
  27.     //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
  28.     // 在此添加用户主函数初始化代码  
  29.     //<<AICUBE_USER_MAIN_INITIAL_END>>
  30.     SYS_Init();
  31.     //<<AICUBE_USER_MAIN_CODE_BEGIN>>
  32.     // 在此添加主函数中运行一次的用户代码  
  33.     printf("Hello World !\n");
  34.                
  35.     //<<AICUBE_USER_MAIN_CODE_END>>
  36.     while (1)
  37.     {
  38.         USBLIB_OUT_Done();              //查询方式处理USB接收的数据
  39.         //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
  40.         // 在此添加主函数中用户主循环代码  
  41.                                 printf("usb sus:%02BX,%02BX,%02BX,%02BX\n",usb_read_reg(FADDR),DeviceState,usb_read_reg(FRAME1),usb_read_reg(POWER));
  42.                                 delay_ms(1000);
  43.                                 if(usb_read_reg(POWER) == 0x00){
  44.                                         //USB 枚举阶段的reset事件会清除ENSUS,需要再次手动设置
  45.                                         printf("usb power 0\n");
  46.                                         IE2 &= ~0x80;
  47.                                         usb_write_reg(POWER,0x01);
  48.                                         IE2 |= 0x80;
  49.                                 }
  50.         //<<AICUBE_USER_MAIN_LOOP_END>>
  51.     }
  52. }
  53. ////////////////////////////////////////
  54. // 系统初始化函数
  55. // 入口参数: 无
  56. // 函数返回: 无
  57. ////////////////////////////////////////
  58. void SYS_Init(void)
  59. {
  60.     EnableAccessXFR();                  //使能访问扩展XFR
  61.     IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基
  62.     //<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
  63.     // 在此添加用户预初始化代码  
  64.     //<<AICUBE_USER_PREINITIAL_CODE_END>>
  65.     PORT3_Init();                       //P3口初始化
  66.     UART1_Init();                       //串口1初始化
  67.     delay_ms(1);
  68.     USBLIB_Init();                      //USB库初始化
  69.     delay_ms(1);
  70.     //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
  71.     // 在此添加用户初始化代码  
  72.                 usb_write_reg(POWER,0x01);
  73.     //<<AICUBE_USER_INITIAL_CODE_END>>
  74.     EnableGlobalInt();                  //使能全局中断
  75.     //USBLIB_WaitConfiged();              //等待USB完成配置
  76. }
  77. ////////////////////////////////////////
  78. // 微秒延时函数
  79. // 入口参数: us (设置延时的微秒值)
  80. // 函数返回: 无
  81. ////////////////////////////////////////
  82. void delay_us(uint16_t us)
  83. {
  84.     do
  85.     {
  86.         NOP(14);                        //(MAIN_Fosc + 500000) / 1000000 - 10
  87.     } while (--us);
  88. }
  89. ////////////////////////////////////////
  90. // 毫秒延时函数
  91. // 入口参数: ms (设置延时的毫秒值)
  92. // 函数返回: 无
  93. ////////////////////////////////////////
  94. void delay_ms(uint16_t ms)
  95. {
  96.     uint16_t i;
  97.     do
  98.     {
  99.         i = MAIN_Fosc / 10000;
  100.         while (--i);
  101.     } while (--ms);
  102. }
  103. //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
  104. // 在此添加用户函数实现代码  
  105. //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
复制代码


三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-04-30 10:08:14

1

主题

1

回帖

9

积分

新手上路

积分
9
发表于 昨天 10:08 | 显示全部楼层
erci*** 发表于 2026-4-26 21:13
可以读取FRAME1帧号,长时间不变视为USB拔出后。
extern BYTE usb_read_reg(BYTE addr);
usb_read_reg(FRAM ...

厉害啊,多谢了
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-5-1 10:20 , Processed in 0.116230 second(s), 60 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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