将串行应用移植到USB接口的简便方法(06-100)
在下面的讨论中,我们假设原先的串行端口代码是用C语言编写的,并且使用了可访问集成UART外设的公共C语言库。 给定这些条件后,将固件移植到CDC需要进行如下的修改:
本文引用地址:https://www.eepw.com.cn/article/81086.htm·在主文件头部,用相应的USB声明代替针对串行端口的#include声明;
·在主函数中,增加对USB-CDC初始化代码的调用;
·在主函数中,增加对USB后台任务的调用;
·验证应用程序代码,以实现与USB后台任务的协同多任务处理;
·最后,为链接器提供USB-CDC专用库,生成最终的可执行代码,然后对闪存芯片进行编程。
实际上,上述这种情况要求应用所调用的任何功能都不能包含阻塞循环。 也就是说,任何功能都不能占用100%的处理器时间,也不能妨碍USB后台任务的执行。 反过来,所有USB专用控制函数、中断、标志和缓冲机制都由CDC类固件后台任务管理,设计工程师无需关注其实现细节。 设计工程师所看到的只是一个非常类似于公共串行端口库的小函数集。表1给出了部分函数例子。
大多数读者立即就可认出这些函数并将其与通用C语言库中的函数对应起来。 事实上,puts 和 gets 函数可以直接用CDC类中对应的 putsUSBUSART 和 getsUSBUSART 函数来替代。 通过其它专用实施函数还可以支持不同的串类型(空结束与固定长度缓冲)和存储类型(RAM还是ROM串表)。 下面给出熟悉的HelloWorld程序利用CDC-USB函数实现的程序。
#include "systemusbusb.h"
#include "io_cfg.h"
void main(void)
{
InitializeSystem();
while(1)
{
USBTasks(); // USB Tasks
HelloWorld(); // send a message to the
world
}//end while
}//end main
HelloWorld(void)
{
If ( mUSBUSARTIsTxTrfReady()) // check if Tx buffer empty
putrsUSBUSART( "Hello World!rn") //
send a new text string
} // Hello World
评论