打印

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

[复制链接]
2202|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

使用特权

评论回复
5
tpgf| | 2022-3-2 11:40 | 只看该作者
cdc结构体的用途是什么呢

使用特权

评论回复
6
wakayi| | 2022-3-2 11:55 | 只看该作者
这样用可以提高效率吗

使用特权

评论回复
7
wowu| | 2022-3-2 12:00 | 只看该作者
相关联的比较多啊

使用特权

评论回复
8
xiaoqizi| | 2022-3-2 12:07 | 只看该作者
指针真的不好理解

使用特权

评论回复
9
木木guainv| | 2022-3-2 12:13 | 只看该作者
如何避免误操作呢

使用特权

评论回复
10
磨砂| | 2022-3-2 12:39 | 只看该作者
需要很多经验的累积啊

使用特权

评论回复
11
lvben5d|  楼主 | 2022-3-4 13:36 | 只看该作者
imdx 发表于 2022-2-14 18:03
友提:GD32E103的USBFS硬件有bug

我按照官网CDC历程, 把官网用定时器去做阻塞的延迟 修改成为软延迟, 测试了下串口自发自收,和只发 只收两天,暂时没发现问题。 你这个硬件有BUG,可以回帖里简单提示下  看大家是否也遇到了?

使用特权

评论回复
12
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例程里,很容易发现这个有点。

使用特权

评论回复
13
imdx| | 2022-3-5 13:11 | 只看该作者
lvben5d 发表于 2022-3-4 13:36
我按照官网CDC历程, 把官网用定时器去做阻塞的延迟 修改成为软延迟, 测试了下串口自发自收,和只发 只 ...

https://zhuanlan.zhihu.com/p/453764799

使用特权

评论回复
14
Roxind| | 2022-5-5 09:57 | 只看该作者
本帖最后由 Roxind 于 2022-5-5 11:40 编辑

在cdc_acm_out这个函数里可以直接重新使能 RX EP 吗,可以把你修改后的部分贴一下吗或者我的邮箱roxin_d@163.com,万分感谢

使用特权

评论回复
15
lvben5d|  楼主 | 2022-5-19 15:25 | 只看该作者
Roxind 发表于 2022-5-5 09:57
在cdc_acm_out这个函数里可以直接重新使能 RX EP 吗,可以把你修改后的部分贴一下吗或者我的邮箱,万分感谢
...

邮件给你交流下,刚看到。 好几月没弄,就没印象了。 这个本来学习得时候,就比较吃力。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

746

帖子

12

粉丝