dma模式

8237A DMA控制器简答

守給你的承諾、 提交于 2019-12-06 03:18:52
(1)、比较中断和DMA两种传输方式的特点。 在中断模式下,外设需与主机传送数据时要请求主机给与中断服务,中断当前主程序的执行,自动转向对应的中断处理程序,控制数据的传输,过程始终是在所执行的指令控制之下。 在DMA模式下,系统中有一个DMA控制器,它是一个可驱动总线的主控部件。当外设与存储器之间需要传送数据时,外设向DMA控制器发出DMA请求,DMA控制器向CPU发出总线请求,取得总线控制权后,DMA控制器按照总线时序控制外设与存储器间的数据传输而不是通过指令来控制数据传输,传输速度大大高于中断方式。 (2)、DMA控制器应具有哪些功能? DMA控制器应有DMA请求输入线,接收I/O设备的DMA请求信号; DMA控制器应有向主机发出总线请求的信号线和接收主机响应的信号线; DMA控制器在取得总线控制权以后应能发出内存地址、I/O读写命令及存储器读写命令控制I/O与存储器间的数据传输过程。 (3)、80286系统一个存储单元是24位物理地址,而8237A在寻址内存空间时,只能给出16位地址码,这一矛盾是如何解决的?有哪些硬件和软件措施? (4)、8237A提供哪几种传送方式? 8237A提供一下几种传送方式: 请求传送方式 单字节传送方式 数据块传送方式 级联传送方式 (5)、8237A只有8位数据线,为什么能完成16位数据的DMA传送? I/O与存储器间在进行DMA传送过程中

STM32_ADC

女生的网名这么多〃 提交于 2019-12-04 22:03:56
裸机--ADC 简介 STM32f103 系列有 3 个 ADC,精度为 12 位,每个 ADC 最多有 16 个外部通道。 其中ADC1 和 ADC2 都有 16 个外部通道,ADC3 根据 CPU 引脚的不同通道数也不同,一般都有8 个外部通道。 功能 电压输入范围: ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。由 VREF-、VREF+ 、VDDA 、VSSA、这四个外部引脚决定. 一般把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,得到ADC 的输入电压范围为:0~3.3V。 电压范围变宽 外部电压转换为0-3.3V. 输入通道 外部通道(最多16道) ADCx_IN0~~ADCx_IN15 内部通道 ADC1 的通道 16 连接到了芯片内部的温度传感器,Vrefint 连接到了通道 17。 ADC2 的模拟通道 16 和 17 连接到了内部的 VSS。 ADC3 的模拟通道 9、14、15、16 和 17 连接到了内部的 VSS。 规则通道 注入通道 触发源 ADC控制写0/1 定时器触发 外部IO触发 转换时间 时钟 ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大是 14M, 采样时间 采样周期最小1.5个周期 Tconv = 采样时间 +12.5 个周期。当 ADCLK = 14MHZ (最高)

[现代操作系统] I/O之硬件原理

匿名 (未验证) 提交于 2019-12-03 00:28:02
I/O 硬件原理 把信息存储在固定大小的块中, 每个块都有自己的地址. 每个块可以独立于其他块读写. 如 硬盘, CD-ROM , USB 盘 … 字符设备以字符为单位发送或接收一个字符流, 而不考虑任何块结构. 它是不可寻址的. 如打印机, 网络接口, 鼠标 (用作指点设备)… I/O 设备一般由两部分组成: 机械部分和电子部分. 电子部分就是设备控制器. 常以插入 (PCI) 扩展槽中的印刷电路板的形式出现. 控制器与设备之间的接口是很低层次的接口. 它的任务就是把串行的位流转换为字节块, 并进行必要的错误校正. 每个控制器有几个寄存器, OS 可以读写来了解, 更改设备的状态信息. 控制器还有 OS 可以读写的 数据缓冲区 . 问题来了: CPU 如何与设备的控制寄存器和数据缓冲区通信. 方法一: 每个控制寄存器被分配一个 I/O 端口 (所有端口形成端口空间, 受保护不被普通用户访问). 然后可以设置指令来读写, 如 IN REG, PORT 将读取控制器寄存器 PORT 中的内容到 CPU 寄存器 REG 方法二: 内存映射 I/O. 将所有控制寄存器映射到内存空间, 都被分配唯一的地址, 且这些内存地址不会再分配. CPU 读入一个字时, 不论是从内存还是 I/O 端口, 都将目的地址放在总线的地址线上, 总线控制线置 READ 信号看. 还要用一条线表明是 I/O

DMA直接存储器访问详解

痴心易碎 提交于 2019-12-02 02:47:42
DMA:Data Memory Access,直接存储器访问。主要功能是可以把数据从一个地方搬到另外一个地方,而且不占用CPU。 DMA1:有7个通道,可以实现 P->M,M->P, M->M DMA2:有7个通道,可以实现 P->M,M->P,M->M DMA初始化结构体 一、数据从哪里来,要到哪里去 1、外设地址,DMA_CPAR 2、存储器地址,DMA_CMAR 3、传输方向,DMA_CCR:DIR 二、数据要传多少,传的单位是什么 1、传输数目,DMA_CNDTR 2、外设地址是否递增,DMA_CCRx:PINC 3、存储器地址是否递增,DMA_CCRx:MINC 4、外设数据宽度, DMA_CCRx:PSIZE 5、存储器数据宽度, DMA_CCRx:MSIZE 三、什么时候传输结束 四、实验设计 1、模式选择,DMA_CCRx:CIRC 2、传输过半,传输完成,传输出错,DMA_ISR 1-M to M:FLASH to SRAM,把内部FLASH的数据传输到内部的SRAM。 2-M to P:SRAM to 串口,同时LED灯闪烁,演示DMA传数据不需要占用CPU。 M to M 编程 : 1-在FLASH中定义好要传输的数据,在SRAM中定义好用来接收FLASH数据的变量。 2-初始化DMA,主要是配置DMA初始化结构体。 3-编写比较函数。 4-编写main函数。

STM32之串口DMA接收不定长数据

风流意气都作罢 提交于 2019-12-01 13:37:59
STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口中断,在中断中读取数据就行了! 中断就是打断程序正常运行,怎么能保证高效呢?经常把主程序打断,主程序还要不要运行了? 同学B:串口可以配置成用DMA的方式接收数据,等接收完毕就可以去读取了! 这个同学是对的,我们可以使用DMA去接收数据,不过DMA需要定长才能产生接收中断,如何接收不定长的数据呢? DMA简介 题外话:其实,上面的问题是很有必要思考一下的,不断思考,才能进步。 什么是DMA DMA :全称Direct Memory Access,即直接存储器访问 DMA 传输将数据从一个地址空间复制到另外一个地址空间。CPU只需初始化DMA即可,传输动作本身是由 DMA 控制器来实现和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。这样的操作并没有让处理器参与处理,CPU可以干其他事情,当DMA传输完成的时候产生一个中断,告诉CPU我已经完成了,然后CPU知道了就可以去处理数据了,这样子提高了CPU的利用率,因为CPU是大脑,主要做数据运算的工作,而不是去搬运数据。DMA 传输对于高效能嵌入式系统算法和网络是很重要的。 在STM32的DMA资源 STM32F1系列

stm32学习笔记——DMA

邮差的信 提交于 2019-11-30 18:17:31
stm32 学习笔记—— DMA 目的:用 DMA 发送数据到 USART1 并同时点亮 LED 灯,熟悉 DMA 配置过程 配置文件: #include "stm32f10x_dma.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" 结构体定义: typedef struct { uint32_t DMA_PeripheralBaseAddr; //DMA 传输目标地址 uint32_t DMA_MemoryBaseAddr; //DAM 传输源地址 uint32_t DMA_DIR; //DMA 传输方向 uint32_t DMA_BufferSize; //DMA 传输大小 uint32_t DMA_PeripheralInc; // 外设是否开启地址自增 uint32_t DMA_MemoryInc; // 内存是否开启地址自增 / uint32_t DMA_PeripheralDataSize;// 外设数据单元 uint32_t DMA_MemoryDataSize; // 内存数据单元,与前者须一致 uint32_t DMA_Mode; //DMA 模式,可循环,也可不循环 uint32_t DMA_Priority; //DMA 优先级,多个

STM32F4学习笔记7——USART Part2

天涯浪子 提交于 2019-11-30 18:16:23
硬件流控制 使用 nCTS 输入和 nRTS 输出可以控制 2 个器件间的串行数据流。如图显示了在这种模式 下如何连接 2 个器件: 分别向 USART_CR3 寄存器中的 RTSE 位和 CTSE 位写入 1,可以分别使能 RTS 和 CTS 流 控制。 RTS 流控制 如果使能 RTS 流控制 (RTSE=1),只要 USART 接收器准备好接收新数据,便会将 nRTS 变 为有效(连接到低电平)。当接收寄存器已满时,会将 nRTS 变为无效,表明发送过程会在 当前帧结束后停止。下图图显示了在使能 RTS 流控制的情况下进行通信的示例。 CTS 流控制 如果使能 CTS 流控制 (CTSE=1),则发送器会在发送下一帧前检查 nCTS。如果 nCTS 有效 (连接到低电平),则会发送下一数据(假设数据已准备好发送,即 TXE=0);否则不会进 行发送。如果在发送过程中 nCTS 变为无效,则当前发送完成之后,发送器停止。 当 CTSE=1 时,只要 nCTS 发生变化,CTSIF 状态位便会由硬件自动置 1。这指示接收器是 否已准备好进行通信。如果 USART_CR3 寄存器中的 CTSIE 位置 1,则会产生中断。下图 显示了在使能 CTS 流控制的情况下进行通信的示例。 注意:停止帧的特殊行为:当使能 CTS 流后,发送器发送停止信号时将不检查 nCTS 输入状态。

AXI-DMA

心已入冬 提交于 2019-11-30 03:08:47
---恢复内容开始--- AXI DMA:为内存与AXI4-Stream外设之间提供高宽带的直接存储访问,scatter/gather功能可将CPU从数据搬移任务中解放出来。 在ZYNQ中,AXI DMA就是FPGA访问DDR3的桥梁,受ARM监管。 AXI-DMA IP核有6个接口 : S_AXI_LITE是ARM配置dma寄存器的接口; M_AXI_SG是从(往)存储器加载(上传)buffer descriptor的接口; 剩下4个构成两对接口:MM2S表示PS向PL传送,S2MM表示PL向PS端(M表示主机代表PS,S表示从机代表PL)            AXI是存储器一侧的接口,AXIS是FPGA一侧的接口。 AXI DMA工作模式分为两种,分别是Direct Register Mode和Scatter/Gather Mode。 Direct Register Mode模式: 具备DMA的基本功能,除了控制寄存器和状态寄存器之外,给出源(目的)地址和传输长度之后就可以开启一次传输了。Direct Register Mode的特点(也是缺点)是配置完一次寄存器之后只能完成存储器连续地址空间的读写,如果有需求往不同地址空间搬运数据的话,那就需要重新配置寄存器开启一次新的传输。S2MM和MM2S不支持多个通道。 scatter gather模式: 把关于传输的基本参数

DMA与PIO是什么东西?

懵懂的女人 提交于 2019-11-29 00:07:47
1. DMA全称是什么?   Direct Memory Access 2. PIO全称是什么?   Programming Input/Output 3. DMA与PIO是两种不同的模式   3.1 DMA     不经过CPU而直接从内存了存取数据的数据交换模式   3.2 PIO     通过CPU执行I/O端口指令来进行数据的读写的数据交换模式 来源: https://www.cnblogs.com/dakewei/p/11434003.html

Linux 4.0的dmaengine编程

*爱你&永不变心* 提交于 2019-11-29 00:01:21
在Linux 4.0下进行dmaengine的编程主要分为两部分,DMA Engine控制器编程和DMA Engine API编程。 DMA Engine API编程 slave DMA用法包括以下的步骤: 1. 分配一个DMA slave通道; 2. 设置slave和controller特定的参数; 3. 获取一个传输描述符; 4. 提交传输描述符; 5. 发起等待的请求并等待回调通知。 下面是以上每一步的详细说明。 1. 分配一个DMA slave通道 在slave DMA上下文通道的分配略有不同,客户端驱动通常需要一个通道,这个通道源自特定的DMA控制器,在某些情况甚至需要一个特定的通道。请求通道的API是channel dma_request_channel()。 其接口如下: struct dma_chan *dma_request_channel(dma_cap_mask_t mask, dma_filter_fn filter_fn, void *filter_param); 1 2 3 其中dma_filter_fn接口定义如下: typedef bool (*dma_filter_fn)(struct dma_chan *chan, void *filter_param); 1 filter_fn是可选的,但是对于slave和cyclic通道我们强烈推荐使用