GD32E103 USBFS cdc结构体 变量这样去看

[复制链接]
2981|14
 楼主| lvben5d 发表于 2022-2-14 10:50 | 显示全部楼层 |阅读模式
GD32, USB, CDC, AC, ev, AN
本帖最后由 lvben5d 于 2022-2-14 11:05 编辑

截至发稿  GD32E103 LIb v1.2.2  的USBFS  device cdc_acm   中,大家会发现 cdc_acm里的成员变量结构体指针 class_data  只有指向结构体 usb_cdc_handler指针数值, 你看不到结构体内容, 而这个指针被官网开发人员作为 static了,既然是static 也占全局变量,就应该设计成全局变量!
在文件cdc_acm_core. c中
static uint8_t cdc_acm_init (usb_dev *udev, uint8_t config_index)

        static usb_cdc_handler cdc_handler;
        。。。。。。
       udev->dev.class_data[CDC_COM_INTERFACE] = (void *)&cdc_handler;


当然你不怕麻烦,每次可以在 live watch 里  输入 (usb_cdc_handler *) &0x????????  (????????是系统给你这个静态结构体分的内存位置 不同人会不同哦)!

至于为什么要改为全局变量,其1是方便 live watch的时候 直接输入 cdc_handler   其2 里面可以看到例程为什么 设计成 自收后立即自发回你的PC端,而我们实际的串口应用往往是想发的时候 上发, 接收的时候处于接收态,(注意USBFS 接收包 单个包最长是64字节, 每接收完64字节 就必须马上发送接收令牌包 否则PC端发大于64个字节的数据包的时候,就再也收不到了!)。
官网的目的是 可靠运行给你示范,如果不自发回来,那么大家注意 cdc->packet_sent这个标志 就不会置1.程序收到1个包后,就再也不能接收了!  所以cdc_acm_check_ready 函数内
{
    if (udev->dev.class_data[CDC_COM_INTERFACE] != NULL) {
        usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE];

        if ((1U == cdc->packet_receive))// && (1U == cdc->packet_sent)) {
            return 0U;
    }

    return 1U;
}
GD32E103的 USB 共享 1.25KB 独立RAM(不是程序运行的)TX 和 RX 可以独立分开,  所有数据的接收共享1个RX FIFO , 而TX FIFO 可以根据端点数 分割内存区域, 但FS每次发送的数据包 内容长度是64字节,虽然USBFS速度也很快,用户发送字节大于64的时候,还是要自己管理1个发送结束标志。避免程序特别快速的往TX FIFO塞入数据。  接收数据的时候,每收好64字节(建议 用户把应用代码 写到 static uint8_t cdc_acm_out (usb_dev *udev, uint8_t ep_num))   这个是USB 中断函数里会callback的函数,把USB RX数据 放到用户自己的处理缓冲区去,然后立即重新使能 RX EP !
sadicy 发表于 2022-2-14 11:09 | 显示全部楼层
我太弱了,没看懂
imdx 发表于 2022-2-14 18:03 | 显示全部楼层
友提:GD32E103的USBFS硬件有bug
littlelida 发表于 2022-2-17 17:35 | 显示全部楼层
还没用过GD的usb
tpgf 发表于 2022-3-2 11:40 | 显示全部楼层
cdc结构体的用途是什么呢
wakayi 发表于 2022-3-2 11:55 | 显示全部楼层
这样用可以提高效率吗
wowu 发表于 2022-3-2 12:00 | 显示全部楼层
相关联的比较多啊
xiaoqizi 发表于 2022-3-2 12:07 | 显示全部楼层
指针真的不好理解
木木guainv 发表于 2022-3-2 12:13 | 显示全部楼层
如何避免误操作呢
磨砂 发表于 2022-3-2 12:39 | 显示全部楼层
需要很多经验的累积啊
 楼主| lvben5d 发表于 2022-3-4 13:36 | 显示全部楼层
imdx 发表于 2022-2-14 18:03
友提:GD32E103的USBFS硬件有bug

我按照官网CDC历程, 把官网用定时器去做阻塞的延迟 修改成为软延迟, 测试了下串口自发自收,和只发 只收两天,暂时没发现问题。 你这个硬件有BUG,可以回帖里简单提示下  看大家是否也遇到了?
 楼主| lvben5d 发表于 2022-3-4 13:42 | 显示全部楼层
tpgf 发表于 2022-3-2 11:40
cdc结构体的用途是什么呢

CDC类 (Communication Device Class) USB的CDC类是USB通信设备类 (Communication Device Class)    ,这;类结构体无非是把相关的变量 回调指针 等原本应该作为全局变量的东东 作为成员变量,统一管理,方便阅读和编程。C99支持了结构体初始化的好模式,可读性强, usb例程里,很容易发现这个有点。
imdx 发表于 2022-3-5 13:11 | 显示全部楼层
lvben5d 发表于 2022-3-4 13:36
我按照官网CDC历程, 把官网用定时器去做阻塞的延迟 修改成为软延迟, 测试了下串口自发自收,和只发 只 ...

https://zhuanlan.zhihu.com/p/453764799
Roxind 发表于 2022-5-5 09:57 | 显示全部楼层
本帖最后由 Roxind 于 2022-5-5 11:40 编辑

在cdc_acm_out这个函数里可以直接重新使能 RX EP 吗,可以把你修改后的部分贴一下吗或者我的邮箱roxin_d@163.com,万分感谢
 楼主| lvben5d 发表于 2022-5-19 15:25 | 显示全部楼层
Roxind 发表于 2022-5-5 09:57
在cdc_acm_out这个函数里可以直接重新使能 RX EP 吗,可以把你修改后的部分贴一下吗或者我的邮箱,万分感谢
...

邮件给你交流下,刚看到。 好几月没弄,就没印象了。 这个本来学习得时候,就比较吃力。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

746

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部