DMA部分

1.DMA简介

1.1什么是DMA

Data Memory Access,直接存储器访问,主要功能是把数据从一个地方搬到另一个地方,且不占用CPU。直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。

1.2功能描述

DMA控制器和Cortex™-M3核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA同时访问相同的目标(RAM或外设)时, DMA请求会暂停CPU访问系统总线达若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。

1.3DMA处理

在发生一个事件后,外设向DMA控制器发送一个请求信号。 DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时, DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求, DMA控制器同时撤销应答信号。如果有更多的请求时,外设可以启动下一个周期。

DMA传送的三个操作:

取地址:外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。

存数据:存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。

递减操作:执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。

    • 功能框图

2.1DMA通道

两个DMA控制器有12个通道(DMA1有7个通道, DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。

每个通道都可以在有固定地址的外设寄存器和存储器地址之间执行DMA传输。 DMA传输的数据量是可编程的,最大达到65535。包含要传输的数据项数量的寄存器,在每次传输后递减。

可编程的数据量

外设和存储器的传输数据量可以通过DMA_CCRx寄存器中的PSIZE和MSIZE位编程。

指针增量

通过设置DMA_CCRx寄存器中的PINC和MINC标志位,外设和存储器的指针在每次传输后可以

有选择地完成自动增量。

增量模式:下一个要传输的地址将=前一个地址+增量值(1、2、4),增量值取决与所选的数据宽度。第一个传输的地址是存放在DMA_CPARx/DMA_CMARx寄存器中地址。传输中,寄存器保持初始值,软件不能改变和读出当前正在传输的地址(它在内部的当前外设/存储器地址寄存器中)。

非循环模式:传输结束后(即传输计数变为0)不再产生DMA操作,开始新DMA传输,在关闭DMA通道的情况下,在DMA_CNDTRx寄存器中重新写入传输数目。

循环模式:最后一次传输结束时, DMA_CNDTRx寄存器的内容会自动地被重新加载为其初始数值,内部的当前外设/存储器地址寄存器也被重新加载为DMA_CPARx/DMA_CMARx寄存器。

设定的初始基地址。

通道配置过程

下面是配置DMA通道x的过程(x代表通道号):

1. 在DMA_CPARx寄存器中设置外设寄存器地址。发生外设数据传输请求时,这个地址将是数据传输 的源或目标。

2. 在DMA_CMARx寄存器中设置数据存储器地址。发生外设数据传输请求时,传输的数据将从这个 地址读出或写入这个地址。

3. 在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。

4. 在DMA_CCRx寄存器的PL[1:0]位中设置通道优先级

5. 在DMA_CCRx寄存器中设置数据传输方向循环模式外设和存储器的增量模式、外设和存储器 的数据宽度、传输一半产生中断或传输完成产生中断

6. 设置DMA_CCRx寄存器的ENABLE位,启动该通道。

循环模式

循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式)。在DMA_CCRx寄存器中的CIRC位用于开启这一功能。当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值, DMA操作将会继续进行。

存储器到存储器模式

DMA通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。当设置了DMA_CCRx寄存器中的MEM2MEM位之后,在软件设置了DMA_CCRx寄存器中的EN位启动DMA通道时, DMA传输将马上开始。当DMA_CNDTRx寄存器变为0时, DMA传输结束。存储器到存储器模式不能与循环模式同时使用。

①外设通道选择

外设通道的选择根据下图的映像选择相应的通道。M->M所有的通道都可以使用,没有硬性规定。

②仲裁器

当多个DMA请求一起来,就需要用到仲裁器

仲裁器根据通道请求的优先级来启动外设/存储器的访问。

优先权管理分2个阶段:

● 软件:每个通道的优先权可以在DMA_CCRx寄存器PL[1:0]位中设置,有4个等级:

─ 最高优先级

─ 高优先级

─ 中等优先级

─ 低优先级

● 硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。举个例子,通道2优先于通道4。

注意: 在大容量产品和互联型产品中, DMA1控制器拥有高于DMA2控制器的优先级

③FIFO

FIFO:First In First Out,是一种先进先出的数据缓存器

其功能可以概括为

(1)对连续的数据流进行缓存,防止在进机和存储操作时丢失数据;

(2)数据集中起来进行进机和存储,可避免频繁的总线操作,减轻CPU的负担;

(3)允许系统进行DMA操作,提高数据的传输速度。这是至关重要的一点,如果不采用DMA操作, 数据传输将达不到传输要求,而且大大增加CPU的负担,无法同时完成数据的存储工作。

每个数据流都独立拥有四级 32 位 FIFO(先进先出存储器缓冲区)。 DMA 传输具有 FIFO模式和直接模式。

直接模式在每个外设请求都立即启动对存储器传输。在直接模式下,如果 DMA 配置为存储器到外设传输那 DMA 会见一个数据存放在 FIFO 内,如果外设启动 DMA 传输请求就可以马上将数据传输过去。

FIFO 用于在源数据传输到目标地址之前临时存放这些数据。FIFO 的阈值分别为 1/4、 1/2、 3/4和满。 如果数据存储量达到阈值级别时, FIFO 内容将传输到目标中。FIFO 对于要求源地址和目标地址数据宽度不同时非常有用,比如源数据是源源不断的字节的数据拼凑成一个 32 位字数据。此时使用 FIFO 功能先把数据缓存起来,分别根据需要输出数据。

FIFO 另外一个作用使用于突发(burst)传输。

④存储器端口、⑤外设端口

DMA 控制器实现双 AHB 主接口,更好利用总线矩阵和并行传输。 DMA 控制器通过存储器端口和外设端口与存储器和外设进行数据传输,关系见图 21-2。 DMA 控制器的功能是快速转移内存数据,需要一个连接至源数据地址的端口和一个连接至目标地址的端口。

DMA2(DMA 控制器 2)的存储器端口和外设端口都是连接到 AHB 总线矩阵,可以使用AHB 总线矩阵功能。 DMA2 存储器和外设端口可以访问相关的内存地址,包括有内部Flash、内部 SRAM、 AHB1 外设、 AHB2 外设、 APB2 外设和外部存储器空间。

DMA1 的存储区端口相比 DMA2 的要减少 AHB2 外设的访问权,同时 DMA1 外设端口是没有连接至总线矩阵的,只有连接到 APB1 外设,所以 DMA1 不能实现存储器到存储器传输。

3.DMA数据配置

3.1配置过程

外设地址

存储器地址

传输方向

DMA2 支持全部三种传输模式,而 DMA1 只有外设到存储器和存储器到外设两种模式。模式选择可以通过 DMA_CCR 寄存器的 DIR[1:0]位控制,进而将 DMA_CCR 寄存器的EN 位置 1 就可以使能 DMA 传输。

DMA 传输停止。 DMA 传输在 DMA_CCR 寄存器的 EN 位被置 1 后就进入准备传输状态,如果有外设请求 DMA 传输就可以进行数据传输。很多情况下,我们明确知道传输数据的数目,比如要传 1000 个或者 2000 个数据,这样我们就可以在传输之前设置 DMA_CNDTR 寄存器为要传输数目值, DMA 控制器在传输完这么多数目数据后就可以控制 DMA 停止传输。

DMA 数据流 x 数据项数 DMA_CNDTR(x 为 0~7)寄存器用来记录当前仍需要传输数目,它是一个 16 位数据有效寄存器,即最大值为 65535,这个值在程序设计是非常有用也是需要注意的地方。我们在编程时一般都会明确指定一个传输数量,在完成一次数目传输后DMA_CNDTR 计数值就会自减,当达到零时就说明传输完成。

如果某些情况下在传输之前我们无法确定数据的数目,那 DMA 就无法自动控制传输停止了,此时需要外设通过硬件通信向 DMA 控制器发送停止传输信号。这里有一个大前提就是外设必须是可以发出这个停止传输信号,只有 SDIO 才有这个功能,其他外设不具备此功能。

数据宽度在CCRx寄存器里设置

在 DMA_CCR 寄存器的 PSIZE[1:0]和 MSIZE[1:0]位分别指定外设和存储器数据宽度大小,可以指定为字节(8 位)、半字(16 位)和字(32 位),我们可以根据实际情况设置。直接模式要求外设和存储器数据宽度大小一样,实际上在这种模式下 DMA 数据流直接使用PSIZE, MSIZE 不被使用。

当源数据小于目标宽度时,源数据分别放到目标寄存器的两个地址中

当源数据长度大于目标时,只有第一个字节可以传过去,其余的全被截断

数据是否需要递增也在CCRx寄存器里设置

3.2直接模式

默认情况下, DMA 工作在直接模式,不使能 FIFO 阈值级别。直接模式在每个外设请求都立即启动对存储器传输的单次传输。直接模式要求源地址和目标地址的数据宽度必须一致,所以只有 PSIZE 控制,而 MSIZE 值被忽略。突发传输是基于 FIFO 的所以直接模式不被支持。另外直接模式不能用于存储器到存储器传输。

在直接模式下,如果 DMA 配置为存储器到外设传输那 DMA 会见一个数据存放在FIFO 内,如果外设启动 DMA 传输请求就可以马上将数据传输过去。

3.3中断

每个 DMA 数据流可以在发送以下事件时产生中断:

1) 达到半传输: DMA 数据传输达到一半时 HTIF 标志位被置 1,如果使能 HTIE 中断控制位将产生达到半传输中断;

2) 传输完成: DMA 数据传输完成时 TCIF 标志位被置 1,如果使能 TCIE 中断控制位将产生传输完成中断;

3) 传输错误: DMA 访问总线发生错误或者在双缓冲模式下试图访问“受限”存储器地址寄存器时 TEIF 标志位被置 1,如果使能 TEIE 中断控制位将产生传输错误中断;

4) FIFO 错误:发生 FIFO 下溢或者上溢时 FEIF 标志位被置 1,如果使能 FEIE 中断控制位将产生 FIFO 错误中断;

5) 直接模式错误:在外设到存储器的直接模式下,因为存储器总线没得到授权,使得先前数据没有完成被传输到存储器空间上, 此时 DMEIF 标志位被置 1,如果使能 DMEIE 中断控制位将产生直接模式错误中断。

错误管理

读写一个保留的地址区域,将会产生DMA传输错误。当在DMA读写操作时发生DMA传输错误时,硬件会自动地清除发生错误的通道所对应的通道配置寄存器(DMA_CCRx)的EN位,该通道操作被停止。此时,在DMA_IFR寄存器中对应该通道的传输错误中断标志位(TEIF)将被置位,如果在DMA_CCRx寄存器中设置了传输错误中断允许位,则将产生中断。

编程

MTM(flash->SRAM)

将DMA的头文件源文件添加进工程,前面已经写过很多次了,这里不写详细步骤了,按照视频里的步骤操作就好,在源文件include "bsp_dma_mtm.h",如果报错说找不到这个头文件,在魔术棒选项的C++下添加头文件路径,做好准备工作,下面按照步骤开始编程

  1. 定义源数组

注意const的作用

const关键字将aSRC_Const_Buffer数组变量定义为常量类型, 表示数据存储在内部的FLASH中

  1. 初始化DMA的顺序

DMA_InitTypeDef DMA_InitStruct; //建立初始化结构体

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);( DMA1_Channel1, ENABLE); //打开时DMA钟

uint32_t DMA_PeripheralBaseAddr; //外设地址

uint32_t DMA_MemoryBaseAddr; // 存储器地址

uint32_t DMA_DIR; // 传输方向

方向的选择看手册和dma库文件

这里源的原因是因为存储器到存储器是flash->SRAM

uint32_t DMA_BufferSize; // 传输数目

uint32_t DMA_PeripheralInc; // 外设地址增量模式

uint32_t DMA_MemoryInc; // 存储器地址增量模式

uint32_t DMA_PeripheralDataSize; // 外设数据宽度

uint32_t DMA_MemoryDataSize; // 存储器数据宽度

uint32_t DMA_Mode; // 模式选择

uint32_t DMA_Priority; // 通道优先级

uint32_t DMA_M2M; // 存储器到存储器模式

DMA_Init(DMA1_Channel1,&DMA_InitStruct);//调用Init函数,将结构体成员写入寄存器

DMA_ClearFlag(MTM_DMA_FLAG_TC); //清楚标志位

DMA_Cmd( DMA1_Channel1, ENABLE); //使能DMA

前面串口那一部分,没有从头到尾的建一遍,而是直接拷贝了写好的代码

到这里,如果把程序下载到开发板上,是直接可以传过去的,但是我们无法验证,为了能够看到数据是否真的传输过去了,所以采用而这个比较函数

void MTM_DMA_Config(void){
  DMA_InitTypeDef DMA_InitStruct;                         // 建立初始化结构体
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);       //打开时DMA钟                       
    
    DMA_InitStruct.DMA_PeripheralBaseAddr=(uint32_t)SCR_buffer;
  DMA_InitStruct.DMA_MemoryBaseAddr=(uint32_t)DST_buffer;
    DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralSRC;
    
    DMA_InitStruct.DMA_BufferSize=buffersize;
    
    DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Enable;
    DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
    DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;
    DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Word;
    DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;
    DMA_InitStruct.DMA_Priority=DMA_Priority_High;
    DMA_InitStruct.DMA_M2M=DMA_M2M_Enable;
    
    DMA_Init(DMA1_Channel1,&DMA_InitStruct);//调用Init函数,将结构体成员写入寄存器
    DMA_Cmd( DMA1_Channel1, ENABLE); 
    
}

为什么DIR选择源呢?

  1. 编写比较函数

比较函数的目的:

判断指定长度的两个数据源是否完全相等,如果完全相等返回1,只要其中一对数据不相等返回0,如果是1的话,在main里会亮绿灯,是0的话则亮红灯

注意const

  1. 编写main函数

有一个问题,在main函数中使用比较函数的时候总是会报如下错勿,需要把函数中的参数extern过来,就好了,用status接收函数结果的时候,别忘记先声明

int main(void)
{
  uint8_t status=0;
    
    LED_GPIO_Config();
    LED_YELLOW;
    Delay(0xFFFFFF);
    MTM_DMA_Config();
    
    
    //while( DMA_GetFlagStatus(DMA1_FLAG_TC6) == RESET );
    status=buffercmd(SCR_buffer,DST_buffer,buffersize);
    if( status == 0 )
  {
        LED_RED;
  }
  else
  {
        LED_GREEN;
    }
    while(1){    
        
        }
}

有一个问题,在while循环那,例程可以走过去,但是我自己建的就会卡住,待解决

因为编程的时候改通道了,while里这个忘改了

MTP

2.DMA初始化结构体

void USARTx_DMA_Config(void){
    DMA_InitTypeDef  DMA_InitStruct;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//USART1时钟使能
    
    DMA_InitStruct.DMA_PeripheralBaseAddr=USART1;//左右数据类型不匹配,先写上一会改,到串口的DR这个寄存器里,所以地址就是DR的地址相对于BASE偏移了0x0
    DMA_InitStruct.DMA_MemoryBaseAddr=(uint32_t)SCRbuffer;
    DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralDST;
    
    
    DMA_InitStruct.DMA_BufferSize=32;//要改
    DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//不需要指针增量,只有串口的接受寄存器,寄存器是有特殊功能的内存,地址不改变,所以不需要增量
    DMA_InitStruct.DMA_MemoryInc=DMA_PeripheralInc_Enable;//需要,不同地址存放不同数据
    DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//串口八位,用字节模式就行
    DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
    
    
    DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;
    DMA_InitStruct.DMA_Priority=DMA_Priority_High;
    DMA_InitStruct.DMA_M2M=DMA_M2M_Disable;
    
    DMA_Init(DMA1_Channel4,&DMA_InitStruct);
    DMA_ClearFlag(DMA1_FLAG_TC4);
    DMA_Cmd(DMA1_Channel4,ENABLE);
}

3.主函数

串口有单独的DMA函数USART_DMACmd

选择Tx,为什么选择TX

首先说明选择TX是因为,这里的发送指的是数据经由串口发送给上位机这部分的发送。

这里要搞清楚存储器到外设的过程

1.USART1外设向DMA发送USART1_TX请求

2.DMA 收到请求信号之后,控制器会给外设(USART1)一个应答信号,当外设收到应答后外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号,就会启动 DMA 的传输。通过DMA总线与总线矩阵从存储器(Flash)中取出数据

3.通过DAM1通道4将数据传输到USART1_TX

这篇文章讲的很详细http://t.csdn.cn/YWCLu,可以看看

DMA的使用模式

  • 从存储器到存储器

  • 从外设到存储器

DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Rx, ENABLE);
  • 从存储器到外设

DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE);

没有外设到外设这个功能

#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
#include "bsp_led.h"
#include "bsp_usart.h"
#include "bsp_dma_mtp.h"




extern uint8_t SCRbuffer[USARTbuffersize];


int main(void)
{
    // 来到这里的时候,系统的时钟已经被配置成72M。
    //LED_GPIO_Config();
    uint16_t i=0;
    uint16_t j=0;
    USART_Config();
   for(i=0;i<USARTbuffersize;i++){
        SCRbuffer[i]=j;
      j++;
}

    USARTx_DMA_Config();

    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

    while(1)
    {

    }
}

### 回答1: PCIE(Peripheral Component Interconnect Express)是一种计算机总线接口,用于连接扩展设备和主机。DMA(Direct Memory Access)是一种数据传输技术,允许外部设备直接访问系统内存,而无需经过CPU的干预。 PCIE DMA部分涉及的文件主要包括驱动程序和相关的库文件。驱动程序是为特定的硬件设备编写的软件,它与操作系统协同工作,使硬件设备能够与操作系统通信并实现其功能。对于PCIE DMA,驱动程序负责管理数据传输和内存访问,确保数据正确地传输到设备或从设备传输回主机内存。 另外,还有一些库文件用于支持驱动程序的开发和调试。这些库文件提供了一些函数和工具,帮助开发者编写和调试驱动程序。例如,可以使用这些库文件提供的函数实现对DMA传输的控制和管理,以确保数据的完整性和正确性。 除了驱动程序和库文件,还可能有一些文档文件,用于说明和解释PCIE DMA部分的工作原理和使用方法。这些文档可以包括设备手册、用户指南、技术规格等,为开发者提供相关资料和指导,帮助他们理解和使用PCIE DMA技术。 综上所述,PCIE DMA部分文件主要包括驱动程序、库文件和相关文档。这些文件的存在和使用,为PCIE DMA技术的开发和应用提供了必要的资源和工具。 ### 回答2: PCIe DMA是指通过PCIe总线进行直接内存访问(Direct Memory Access)的技术。它能够实现数据在外部设备和系统内存之间的高速传输,提供了高带宽、低延迟的数据传输通路。 在使用PCIe DMA时,需要相关的文件和驱动来支持和管理DMA操作。这些文件和驱动通常由硬件设备的制造商提供。 1. 驱动文件:在使用PCIe DMA之前,需要安装和加载相应的PCle DMA驱动程序。这些驱动程序能够与操作系统进行交互,确保DMA操作的正确执行。驱动文件会包含设备的ID和供应商ID信息,以及控制和配置硬件设备的相关代码。 2. DMA控制器配置文件:DMA控制器负责管理和控制数据传输的过程。在配置DMA控制器时,需要相应的配置文件来指定DMA通道、传输模式、传输大小等参数。配置文件通常是由硬件制造商提供,根据具体应用需求进行修改。 3. DMA应用程序文件:DMA应用程序用来实现具体的数据传输功能。它可以是一个独立的软件程序,也可以是在其他应用程序中集成的模块。DMA应用程序通过调用DMA驱动接口,实现数据在系统内存和外部设备之间的传输。 4. DMA中断处理文件:在DMA传输过程中,可能会产生中断。相应的中断处理程序负责处理和响应这些中断事件。中断处理文件中包含了中断处理函数的实现代码,用于处理DMA传输的中断事件。 综上所述,PCIe DMA部分文件包括驱动文件、DMA控制器配置文件、DMA应用程序文件和DMA中断处理文件。这些文件共同协作,实现高速、高效的数据传输,提升系统性能。 ### 回答3: PCIe DMA(Direct Memory Access)是一种数据传输技术,可以将数据直接传输到内存,无需通过CPU的中断处理和复制操作。它通过使用专门的硬件逻辑和通信协议,实现高速且低延迟的数据传输。 在PCIe DMA中,需要使用一些特定的文件和软件来实现数据传输。这些文件包括驱动程序、设备描述符和应用程序。 驱动程序是用来控制和管理PCIe DMA的关键组件之一。驱动程序与系统内核紧密集成,可以通过与DMA硬件交互,启动和停止DMA操作,以及配置传输的数据大小和方向等参数。 设备描述符是用来描述要传输的数据的数据结构。它包括源地址、目标地址、数据长度等信息,用于告知DMA硬件如何进行数据传输。 应用程序是使用PCIe DMA的用户程序。它可以通过调用驱动程序提供的接口,发送数据到设备或从设备接收数据。应用程序通常需要基于实际需求实现不同的功能,如文件传输、数据采集等。 需要注意的是,PCIe DMA的实现需要硬件和软件的配合。硬件方面,需要有支持DMA的PCIe设备和相关的外围电路。软件方面,需要有配套的驱动程序和应用程序。 总结起来,PCIe DMA的文件包括驱动程序、设备描述符和应用程序,它们共同协作来实现快速和高效的数据传输。它在实际应用中广泛应用于数据存储、高速网络通信等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值