现在越来越多的用户在使用USB的CDC类做USB虚拟串口,毕竟现在笔记本已经基本没有9针串口了,再去拿一个USB转串口线还是比较麻烦的,所以USB CDC类还是不错的选择。而好消息是,ARM官网为其Cortex-M系列(目前支持M0, M0+, M3, M4)定制化了一套非常精简的USB协议栈,这套协议栈在Keil安装目录下以.lib的形式提供,但是其在ARMmbed开源调试器CMSIS-DAP项目中将该协议栈开放出来。该协议支持USB Host和USB Device,其中USB Host支持HID和MSC类,USB Device支持HID类,MSC类,CDC类,Audio类和自定义设备类,其整体功能框架如下图,并在CMSIS-DAP项目中适配了Freescale的K20DX128Vxx5和NXP的LPC11u35及LPC4322。
<img id="aimg_fDjjj" class="zoom" file="http://files.chinaaet.com/images/blog/2015/04/17/1912931217795.png" lazyloadthumb="1" border="0" alt="" />
为了适配USB CDC类的应用,我将CMSIS-DAP项目中的关于USB CDC类协议栈文件抠了出来,并将其移植到FRDM-KL25的官方SampleCode里,移植过程非常简单,使用起来也很方便,下面简单介绍下移植的环境和步骤:
开发环境:IAR v7.3
开发平台:FRDM-KL25
参考例程:KL25_SC中kl25_sc_rev10\klxx-sc-baremetal\build\iar\platinum(基于该例程进行修改)
1. 将CMSIS USB Stack协议栈相关文件放到kl25_sc_rev10\klxx-sc-baremetal\src\projects\platinum文件夹下,如下图:
<img id="aimg_AssES" class="zoom" file="http://files.chinaaet.com/images/blog/2015/04/17/1913153984626.png" lazyloadthumb="1" border="0" alt="" />
2. 打开platinum例程的IAR工程,并将CMSIS USB Stack->src和CMSIS USB Stack->Porting use两个文件夹下的文件添加到IAR工程管理目录下,如下图,并在IAR的General Options->C/C++ Complier->Preprocesser选项中添加CMSIS USB Stack->inc的头文件搜索路径,从下图可以看到USB Device CDC类相关的文件只有7个,比较清晰简洁:
<img id="aimg_cUZdZ" class="zoom" file="http://files.chinaaet.com/images/blog/2015/04/17/1913284242230.png" lazyloadthumb="1" border="0" alt="" />
3. 打开main.c文件,将如下图的相关代码全部copy并覆盖掉原代码,如下图所示:
<img id="aimg_Wy2iB" class="zoom" file="http://files.chinaaet.com/images/blog/2015/04/17/1913695626585.png" lazyloadthumb="1" border="0" alt="" />
4. 此外,针对该工程还需要修改两个部分,一是需要配置时钟部分PLL锁相环的倍频系数,使其倍到96M(因为USB的时钟源为MCGPLL/2=48),即修改freedom.h中PLL0_VDIV参数为48,然后由于PLL输出96M,其Coreclock和busclock的配置需要保证SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIV1(1) | SIM_CLKDIV1_OUTDIV4(1);即Coreclock=48MHz,Busclock=24M。二是将USB的中断服务函数加载到中断向量表里面,即打开isr.h,配置如下:
<img id="aimg_Op289" class="zoom" file="http://files.chinaaet.com/images/blog/2015/04/17/1913854118306.png" lazyloadthumb="1" border="0" alt="" />
5. 按照以上步骤修改完毕,重新编译并下载到KL25,将FRDM-KL25的另个USB口插到电脑即会弹出安装驱动的提示,由于程序中我将设备描述符中的VID和PID改成了官方USB Stack 4.1.1的配置,所以安装驱动时直接选择其目录下的inf文件即可(该**最后我附上的代码中也带了该驱动文件),安装完后即可枚举成Virtual Com Port的虚拟串口设备,如下图。然后打开串口调试助手,输入任意连续的字符串并点击发送(端口我配置了最大包的size是32bytes,但是协议中自带拆包打包等功能,不需要用户关心),可以接收返回同样的数据,如下图所示。
<img id="aimg_t77kz" class="zoom" file="http://files.chinaaet.com/images/blog/2015/04/17/1914008091531.png" lazyloadthumb="1" border="0" alt="" />
<img id="aimg_pcbnZ" class="zoom" file="http://files.chinaaet.com/images/blog/2015/04/17/1914160033314.png" lazyloadthumb="1" border="0" alt="" />
好了,今天就不多聊了,简单介绍到这,博客最后是完整的移植好的代码包供参考。此外,该代码参考了超核电子的开发包,在此表示感谢。有点累,休息一下,呵呵,未完待续~
附件中为基该工程完整的代码包供参考: |