目录
一、项目需求
GD32F150C8T6与PC通信,实现指令传递、应答、外接USB移动硬盘里大文件与PC的双向传输。硬件原理图上预留了一个USB接口。
二、USBD调研和传输方案的确定
关于USB协议我是一点不懂,从调研开始。从官方用户手册和USBD库使用指南可以得到如下的信息:
1. USBD:通用串行总线全速设备接口。
2. GD32F150官方使用手册说明
3.USBD库使用指南信息
4. 关于CDC类
CDC(Communication Device Class)协议,是 USB 组织为各种通信设备定义的 USB 子类。
需要下载官方驱动兆易创新 (gd32mcu.com)USB Virtual COM Port Driver。我个人把CDC当成一个超高速的串口。
5.方案确定
由上面碎片化的信息对USBD有了一些感性认知,选择USBD CDC类来实现本项目的需求。
三、程序源码
1.接收函数,官方的收发函数不能直接用在实际项目中,需要做点小调整
2.发送函数 ,参考了http://t.csdn.cn/VItRm ,根据自己芯片型号和需求稍作调整
3.时钟配置有个小坑,F103官方标准库DEMO时钟默认是108MHZ,而USBD库按照96MHZ,进行2分频来获得48MHZ的USBD时钟,但实际上得到的是54MHZ,超了USBD时钟速率。用GD32F103系列需要修改系统宏定义,GD32F150默认72MHZ不需要改。
4.USBD官方库里systic的中断服务函数缺失(前面串口章节有提到),要补上,不然进入systic的中断会卡死在B.
5.Handle测试函数实现了GD32根据接收到的PC指令来发送任意字节的数据
四、总结
USBD内容丰富而复杂,我目前只是能够使用CDC类,就算是这样我对CDC内部的中断处理逻辑也不是很清晰,这一块需要花点时间去理解,但不深究。USBD从接手到方案的确定到代码的配置,花了几天时间,过程中踩了很多坑,后续会一并总结出来。