在前段时间我连续写了15篇关于【.Net Micro Framework PortingKit–?】的系列文章,初步介绍了.Net Micro Framework在Cortex-M3平台上的移植过程,最近一段时间又对另外两块Cortex-M3开发板进行了相关的移植工作,新实现了USB驱动、SPI驱动、触摸屏驱动、LCD驱动(ILI9325),除此之外还新开发了TinyGUI图形库,该图形库仅需要极少量的内存便能运行在Cortex-M3平台上。从今天开始,我会陆续写这方面开发的相关文章。
第一次编写USB的驱动,是在Ti DM355平台上,当时用了大概二个多月的时间才移植成功,花了这么长的时间,一是USB运行机制非常复杂,二是对嵌入式开发当时并不是特别熟悉。在此期间我写四篇关于USB的文章,有兴趣的朋友可参考一下《Micro Framework USB Driver开发》、《MF Porting之USB驱动开发》、《【.Net MF新特性】Usb双接口支持》和《.Net Micro Framework - USB Mass Storage功能实现》。
STM32F103系列的芯片,其USB接口仅支持Device模式,不像Ti DM355其接口支持OTG、Host、Device三种模式,所以寄存器访问相对比较简单(不过ST最新推出的互联性芯片,其USB接口和Ti的一样了)。
USB接口支持8个端点,数据传输支持三种模式:DMA、双缓冲、单缓冲,简单期间,我仅实现了单缓冲模式。
首先,我们需要声明USB寄存器相对应的结构体,以期方便操作相关的寄存器。
struct CortexM3_USB_Base
{
//+ 0x40
/****/ volatile UINT16 CNTR; //控制寄存器
static const UINT16 CNTR_CTRM = ((UINT16)0x8000); //成功传输中断标志
static const UINT16 CNTR_PMAOVRM = ((UINT16)0x4000); //分组缓冲区溢出中断标志
略……
};
struct CortexM3_USB_EndPoint
{
/****/ volatile UINT16 EP; //端点寄存器
static const UINT16 EP_CTR_RX = ((UINT16)0x8000); //正确接收标志
static const UINT16 EP_DTOG_RX = ((UINT16)0x4000); //用于数据接收的数据翻转位
略…….
};
struct CortexM3_USB_BTABLE
{
static const UINT32 c_Base = 0x40006000; //~0x400063FF USB/CAN共享的SRAM 512字节(c_PMA_Base)
/****/ volatile UINT16 ADDR_TX; //发送缓冲区地址
static const UINT16 ADDR_TX_Mask = ((UINT16)0xFFFE);
UINT16 RESERVED0;
略…….
};
struct CortexM3_USB
{
static const UINT32 c_Base = 0x40005C00;
static const UINT32 c_CFGR_USBPRE_BB = 0x42000000 + 0x21004 * 32 + 0x16 * 4;
static const UINT32 c_USB_MAX_EP = 3; //8
CortexM3_USB_EndPoint EP[8]; //0x0-0x1c
UINT16 RESERVED0[16];
CortexM3_USB_Base Base; //0x40-0x4c
};
USB提供两个中断信号,一个是c_IRQ_Index_USB_HP_CAN_TX,另一个是c_IRQ_Index_USB_LP_CAN_RX0,不过前一个对低速传输似乎必要性不大。
所以这里仅启用第二种中断,代码如下:
if(!CPU_INTC_ActivateInterruptEx( CortexM3_NVIC::c_IRQ_Index_USB_LP_CAN_RX0, (UINT32)(void *)USB_LP_IRQHandler)) return FALSE;
此外控制USB软连接的GPIO为PB14,启用USB功能前,要置位该Pin脚。
CPU_GPIO_DisablePin( USB_EN_PIN,RESISTOR_DISABLED,TRUE,GPIO_ALT_MODE_9); //DISABLE
CPU_GPIO_DisablePin( USB_EN_PIN,RESISTOR_DISABLED,TRUE,GPIO_ALT_MODE_5); //ENABLE
针对.Net Micro Framework来说,USB仅用到三个端点,所以只需用初始化这三个端点即可,相关代码如下:
CortexM3_USB &USB = CortexM3::USB();
USB.Base.DADDR = CortexM3_USB_Base::DADDR_EF | 0;
//EP0
USB.EP[0].EP = CortexM3_USB_EndPoint::EP_TYPE_CONTROL | (0 & CortexM3_USB_EndPoint::EP_EA);
SetTxStatus(0,CortexM3_USB_EndPoint::EP_TX_NAK);
SetRxStatus(0,CortexM3_USB_EndPoint::EP_RX_VALID);
//lcd_printf("EP0:%x/r/n",USB.EP[0].EP);
//EP1
USB.EP[1].EP = CortexM3_USB_EndPoint::EP_TYPE_BULK | (1 & CortexM3_USB_EndPoint::EP_EA);
SetTxStatus(1,CortexM3_USB_EndPoint::EP_TX_NAK);
SetRxStatus(1,CortexM3_USB_EndPoint::EP_RX_DISABLED);
if(USB.EP[1].EP & CortexM3_USB_EndPoint::EP_DTOG_RX) USB.EP[1].EP |= CortexM3_USB_EndPoint::EP_DTOG_RX;
if(USB.EP[1].EP & CortexM3_USB_EndPoint::EP_DTOG_TX) USB.EP[1].EP |= CortexM3_USB_EndPoint::EP_DTOG_TX;
//EP2
USB.EP[2].EP = CortexM3_USB_EndPoint::EP_TYPE_BULK | (2 & CortexM3_USB_EndPoint::EP_EA);
SetTxStatus(2,CortexM3_USB_EndPoint::EP_TX_DISABLED);
SetRxStatus(2,CortexM3_USB_EndPoint::EP_RX_VALID);
if(USB.EP[2].EP & CortexM3_USB_EndPoint::EP_DTOG_RX) USB.EP[2].EP |= CortexM3_USB_EndPoint::EP_DTOG_RX;
if(USB.EP[2].EP & CortexM3_USB_EndPoint::EP_DTOG_TX) USB.EP[2].EP |= CortexM3_USB_EndPoint::EP_DTOG_TX;
限于篇幅,这里的代码仅列这么多,有兴趣的朋友请参考.Net Micro Framework的相关USB驱动的源码,其架构大同小异。
最终成功运行的效果图如下:
分享到:
相关推荐
It begins with the basics of accessing hardware and networking before delving deep into the less well–known areas such as cryptography and globalization, and how to use technologies such as wireless ...
《玩转.NET Micro Framework移植-基于STM32F10x处理器》源程序
.NET Micro Framework 电子书
.net micro framework关于文件操作的例子,非常详细。还包括了点击等东西
.NET Micro Framework for Windows 7(X64) USB驱动安装说明,包含相应的驱动程序
expert .net micro frameworkexpert .net micro frameworkexpert .net micro framework
.NET Micro Framework自动化测试工具,需.NET Micro Framework3.0和.NET Micro Framework Test Kit支持...
Microsoft .NET Micro Framework 2.5 SDK。 这个我暂时没用,权当放在这里存放,需要的,自己动手。
micro framework 4.0 SDK,最新开发工具包
近来有些刚入门的用户,不太了解.NET Micro Framework开发板的使用,所以写了这篇文档,以期缩短用户对开发板的熟悉时间。
这是我自己改造的.Net Micro Framework模拟器,比windows自带的漂亮多了。 覆盖该目录下的同名文件(路径以实际开发包安装位置为准)即可。 C:\Program Files\Microsoft .NET Micro Framework\v2.0.3036\Tools 支持...
.NET Micro Framework 电子书
http://item.taobao.com/item.htm?id=7117999726 .NET Micro Framework开发板的Key文件的部署说明。
.NET Micro Framework开发板原理图(红牛开发板)
.NET Micro Framework开发板使用手册(红牛开发板)
如何顺利编译.Net Micro Framework Porting Kit 4.1 安装路径不能有空格
注:比上一个模拟器多了支持方向键控制 这是我自己改造的.Net Micro Framework模拟器,比windows自带的漂亮多了。 覆盖该目录下的同名文件(路径以实际开发包安装位置为准)即可。 C:\Program Files\...
《玩转.NET Micro Framework 移植-基于STM32F10x处理器》一书所有的源代码。其它更多的资源可以访问我的blog:http://blog.csdn.net/norains 谢谢!
GHI .NET Micro Framework培训教材