【.Net Micro Framework PortingKit(补) – 1】USB驱动开发

简介:

前段时间我连续写了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寄存器相对应的结构体,以期方便操作相关的寄存器。


 
 
  1. struct CortexM3_USB_Base  
  2.  
  3. {  
  4.  
  5.     //+ 0x40  
  6.  
  7.     /****/ volatile UINT16 CNTR;  //控制寄存器  
  8.  
  9.     static const    UINT16 CNTR_CTRM = ((UINT16)0x8000);            //成功传输中断标志  
  10.  
  11.     static const    UINT16 CNTR_PMAOVRM = ((UINT16)0x4000);    //分组缓冲区溢出中断标志  
  12.  
  13.     略……  
  14.  
  15. };  
  16.  
  17.    
  18.  
  19. struct CortexM3_USB_EndPoint  
  20.  
  21. {  
  22.  
  23.      /****/ volatile UINT16 EP;   //端点寄存器  
  24.  
  25.     static const    UINT16 EP_CTR_RX = ((UINT16)0x8000);               //正确接收标志  
  26.  
  27.     static const    UINT16 EP_DTOG_RX = ((UINT16)0x4000);            //用于数据接收的数据翻转位  
  28.  
  29. 略…….  
  30.  
  31. };  
  32.  
  33.    
  34.  
  35. struct CortexM3_USB_BTABLE  
  36.  
  37. {  
  38.  
  39.     static const UINT32 c_Base = 0x40006000;  //~0x400063FF USB/CAN共享的SRAM 512字节(c_PMA_Base)  
  40.  
  41.        
  42.  
  43.     /****/ volatile UINT16 ADDR_TX;     //发送缓冲区地址  
  44.  
  45.     static const    UINT16 ADDR_TX_Mask = ((UINT16)0xFFFE);       
  46.  
  47.     UINT16  RESERVED0;  
  48.  
  49.     略…….  
  50.  
  51. };  
  52.  
  53.    
  54.  
  55. struct CortexM3_USB  
  56.  
  57. {  
  58.  
  59.     static const UINT32 c_Base = 0x40005C00;  
  60.  
  61.     static const UINT32 c_CFGR_USBPRE_BB = 0x42000000 + 0x21004 * 32 + 0x16 * 4;  
  62.  
  63.     static const UINT32 c_USB_MAX_EP = 3;  //8  
  64.  
  65.     CortexM3_USB_EndPoint EP[8]; //0x0-0x1c      
  66.  
  67.     UINT16 RESERVED0[16];       
  68.  
  69.     CortexM3_USB_Base Base;      //0x40-0x4c    
  70.  
  71. };  
  72.  
  73.    
  74.  
  75. USB提供两个中断信号,一个是c_IRQ_Index_USB_HP_CAN_TX,另一个是c_IRQ_Index_USB_LP_CAN_RX0,不过前一个对低速传输似乎必要性不大。  
  76.  
  77. 所以这里仅启用第二种中断,代码如下:  
  78.  
  79. if(!CPU_INTC_ActivateInterruptEx( CortexM3_NVIC::c_IRQ_Index_USB_LP_CAN_RX0, (UINT32)(void *)USB_LP_IRQHandler)) return  FALSE;  
  80.  
  81. 此外控制USB软连接的GPIO为PB14,启用USB功能前,要置位该Pin脚。  
  82.  
  83. CPU_GPIO_DisablePin( USB_EN_PIN,RESISTOR_DISABLED,TRUE,GPIO_ALT_MODE_9);  //DISABLE   
  84.  
  85. CPU_GPIO_DisablePin( USB_EN_PIN,RESISTOR_DISABLED,TRUE,GPIO_ALT_MODE_5);  //ENABLE  
  86.  
  87. 针对.Net Micro Framework来说,USB仅用到三个端点,所以只需用初始化这三个端点即可,相关代码如下:  
  88.  
  89. CortexM3_USB &USB = CortexM3::USB();        
  90.  
  91. USB.Base.DADDR = CortexM3_USB_Base::DADDR_EF | 0;  
  92.  
  93.    
  94.  
  95.  //EP0  
  96.  
  97.  USB.EP[0].EP = CortexM3_USB_EndPoint::EP_TYPE_CONTROL |   (0 & CortexM3_USB_EndPoint::EP_EA);    
  98.  
  99.  SetTxStatus(0,CortexM3_USB_EndPoint::EP_TX_NAK);  
  100.  
  101.  SetRxStatus(0,CortexM3_USB_EndPoint::EP_RX_VALID);  
  102.  
  103.  //lcd_printf("EP0:%x\r\n",USB.EP[0].EP);  
  104.  
  105.        
  106.  
  107.  //EP1  
  108.  
  109.  USB.EP[1].EP = CortexM3_USB_EndPoint::EP_TYPE_BULK | (1 & CortexM3_USB_EndPoint::EP_EA);  
  110.  
  111. SetTxStatus(1,CortexM3_USB_EndPoint::EP_TX_NAK);  
  112.  
  113. SetRxStatus(1,CortexM3_USB_EndPoint::EP_RX_DISABLED);        
  114.  
  115.  if(USB.EP[1].EP & CortexM3_USB_EndPoint::EP_DTOG_RX)  USB.EP[1].EP |= CortexM3_USB_EndPoint::EP_DTOG_RX;        
  116.  
  117. if(USB.EP[1].EP & CortexM3_USB_EndPoint::EP_DTOG_TX)  USB.EP[1].EP |= CortexM3_USB_EndPoint::EP_DTOG_TX;  
  118.  
  119.          
  120.  
  121.  //EP2  
  122.  
  123.  USB.EP[2].EP = CortexM3_USB_EndPoint::EP_TYPE_BULK | (2 & CortexM3_USB_EndPoint::EP_EA);  
  124.  
  125. SetTxStatus(2,CortexM3_USB_EndPoint::EP_TX_DISABLED);  
  126.  
  127. SetRxStatus(2,CortexM3_USB_EndPoint::EP_RX_VALID);   
  128.  
  129. if(USB.EP[2].EP & CortexM3_USB_EndPoint::EP_DTOG_RX)  USB.EP[2].EP |= CortexM3_USB_EndPoint::EP_DTOG_RX;        
  130.  
  131. if(USB.EP[2].EP & CortexM3_USB_EndPoint::EP_DTOG_TX)  USB.EP[2].EP |= CortexM3_USB_EndPoint::EP_DTOG_TX;  
  132.  

限于篇幅,这里的代码仅列这么多,有兴趣的朋友请参考.Net Micro Framework的相关USB驱动的源码,其架构大同小异。

最终成功运行的效果图如下:

 

 








本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/321207,如需转载请自行联系原作者

相关文章
|
2月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
703 2
|
5月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
630 3
|
2月前
|
开发框架 安全 .NET
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
.NET Framework是Windows平台的开发框架,包含CLR和FCL,支持多种语言开发桌面、Web应用。常用版本有3.5、4.5.2、4.8.1,系统可同时安装多个版本,确保软件兼容运行。
724 0
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
|
3月前
|
C++
提示缺少.NET Framework 3.5 安装错误:0x80070002、0x800F0950\0x80004002
.NET Framework常见问题及解决方法汇总,
545 0
|
5月前
|
C++ Windows
WindowsDLL修复专家,MSVCP**、DLL修复vcruntime**、DLL修复、`.Net Framework`缺失、DirectX类DLL修复、VC运行库修复
Windows DLL修复专家是一款专为解决因DLL文件缺失、版本错误导致的软件或游戏无法运行问题的系统工具。它支持一键扫描和修复各类DLL异常,涵盖MSVCP、vcruntime、.NET Framework、DirectX等多种常见问题。具备自动检测、备份还原功能,确保修复过程安全可靠。适用于软件报错、系统异常及新系统适配场景,降低用户手动修复门槛,提升系统稳定性与兼容性。
228 3
|
4月前
.NET Framework 3.5离线安装包合集下载
本文介绍了如何获取和安装.NET Framework运行库离线合集包。用户可通过提供的链接下载安装包,安装过程简单,按提示逐步操作即可完成。安装时可选择所需版本,工具会自动适配架构,无需手动判断,方便高效。
2834 0
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
192 1
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
210 3
|
机器学习/深度学习 编解码 算法
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
《nnU-Net: 自适应框架用于基于U-Net的医学图像分割》是一篇2018年的论文,发表在Nature上。该研究提出了一种自适应的医学图像分割框架nnU-Net,能够自动调整模型的超参数以适应不同的数据集。通过2D和3D U-Net及级联U-Net的组合,nnU-Net在10个医学分割数据集上取得了卓越的性能,无需手动调整。该方法强调数据增强、预处理和训练策略等技巧,为医学图像分割提供了一个强大的解决方案。
624 0
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation

热门文章

最新文章