单片机学习小组
登录
直播中
杨言
12年用户
555经验值
私信
关注
怎样在STM32F407中去使用DMA控制器呢
开启该帖子的消息推送
控制器
STM32F407
CPU与外设之间的数据传送方式有哪几种?
DMA的原理是什么?是怎样传送的?
在
STM32
F407中使用DMA有哪些步骤?
回帖
(1)
庞晓瑜
2022-2-28 15:00:20
一、DMA的介绍
1.DMA由来
DMA(Direct Memory Access,直接存储器访问)。在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式、中断传送方式。CPU是通过系统总线与其他部件连接并进行数据传输。
1.1程序传送方式
程序传送方式是指直接在程序控制下进行数据的输入/输出操作。分为无条件传送方式和查询(条件传送方式)两种。
1.1.1无条件传送方式
微机系统中的一些简单的外设,如开关、继电器、数码管、发光二极管等,在它们工作时,可以认为输入设备已随时准备好向CPU提供数据,而输出设备也随时准备好接收CPU送来的数据,这样,在CPU需要同外设交换信息时,就能够用IN或OUT指令直接对这些外设进行输入/输出操作。由于在这种方式下CPU对外设进行输入/输出操作时无需考虑外设的状态,故称之为无条件传送方式。
1.1.2查询(有条件)传送方式
查询传送也称为条件传送,是指在执行输入指令(IN)或输出指令(OUT)前,要先查询相应设备的状态,当输入设备处于准备好状态、输出设备处于空闲状态时,CPU才执行输入/输出指令与外设交换信息。为此,接口威廉希尔官方网站 中既要有数据端口,还要有状态端口。
1.2中断传送方式
中断传送方式是指当外设需要与CPU进行信息交换时,由外设向CPU发出请求信号,使CPU暂停正在执行的程序,转而去执行数据输入/输出操作,待数据传送结束后,CPU再继续执行被暂停的程序。
以上两种方式,均由CPU控制数据传输,不同的是程序传送方式由CPU来查询外设状态,CPU处于主动地位,而外设处于被动地位。这就是常说的----对外设的轮询,效率低。而中断传送法师则是外设主动向CPU发生请求,等候CPU处理,在没有发出请求时,CPU和外设都可以独立进行各自的工作。 需要进行断点和现场的保护和恢复,浪费了很多CPU的时间,适合少量数据的传送。
1.3 DMA原理
DMA的出现就是为了解决批量数据的输入/输出问题。DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。这样数据的传送速度就取决于存储器和外设的工作速度。
通常系统总线是由CPU管理的,在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态(高阻状态),而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。因此DMA控制器必须有以下功能:
1、能向CPU发出系统保持(HOLD)信号,提出总线接管请求;
2、当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;
3、能对存储器寻址及能修改地址指针,实现对内存的读写;
4、能决定本次DMA传送的字节数,判断DMA传送是否借宿。
5、发出DMA结束信号,使CPU恢复正常工作状态。
DMA传输将从一个地址空间复制到另外一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。 典型例子---移动一个外部内存的区块到芯片内部更快的内存区。
对于实现DMA传输,它是由DMA控制器直接掌管总线(地址总线、数据总线和控制总线),因此,存在一个总线控制权转移问题
DMA传输开始前: CPU------>DMA控制器
DMA传输结束后: DMA控制器------>CPU
一个完整的DMA传输过程必须经历DMA请求、DMA响应、DMA传输、DMA结束4个步骤。
DMA方式是一种完全由硬件进行组信息传送的控制方式,具有中断方式的优点,即在数据准备阶段,CPU与外设并行工作。
2.DMA的传送过程
DMA的数据传送分为预处理、数据传送和后处理3个阶段。
(1)预处理
由CPU完成一些必要的准备工作。首先,CPU执行几条I/O指令,用以测试I/O设备状态,向DMA控制器的有关寄存器置初值,设置传送方向、启动该设备等。然后,CPU继续执行原来的程序,直到I/O设备准备好发送的数据(输入情况)或接受的数据(输出情况)时,I/O设备向DMA控制器发送DMA请求,再由DMA控制器向CPU发送总线请求(统称为DMA请求),用以传输数据。
(2)数据传送
DMA的数据传输可以以单字节(或字)为基本单位,对于以数据块为单位的传送(如银盘),DMA占用总线后的数据输入和输出操作都是通过循环来实现。需要特别之处的是,这一循环也是由DMA控制器(而不是通过CPU执行程序)实现的,即数据传送阶段是完全由DMA(硬件)来控制的。
(3)后处理
DMA控制器向CPU发送中断请求,CPU执行中断服务程序做DMA结束处理,包括检验送入主存的数据是否正确,测试传送过程中是否出错(错误则转入诊断程序)和决定是否继续使用DMA传送其他数据块等。
3.在STM32F407中使用DMA
3.1使用大约步骤
1、使能DMA时钟,并等待数据流可配置。 使能DMA时钟,才可配置DMA相关的寄存器。要对DMA的配置寄存器DMA_SxCR进行配置,则要等其最低位为0----即DMA传输禁止,才可配置。
2、DMA_SxCR(指定的外设--x)设置该流x,包括配置通道,外设地址,存储器地址,传输数据量、优先级等。
3、使能外设的DMA功能
4、使能DMA数据流,启动传输。
5、查询DMA传输状态。
3.2 从DMA配置时最为关键的寄存器出发
DMA数据流x配置寄存器(DMA_SxCR)
CHSEL[2:0] 3位8个通道选择,即对于流x选择哪个通道
PL[1:0] 2位,设置流x的软件优先级,DMA控制器的仲裁器根据软件优先级,辅以硬件优先级来仲裁进行哪个数据流哪个通道的数据传输。
MSIZE[1:0] 2位,存储器的数据宽度(8位、16位、32位)
PSIZE[1:0] 2位,外设的数据宽度
MINC 1位, 设置存储器递增模式,存储器地址指针时递增还是固定
PINC 1位, 设置外设递增模式,外设地址指针递增还是固定
DIR 2位,数据传输方向
TCIE 1位,传输完成中断使能
HTIE 1位,半传输中断使能
TEIE 1位,传输错误中断使能
DMEIE 1位, 直接模式错误中断使能
EN 1位, 0禁止该数据流,此时可配置该数据流
1使能该数据,参与仲裁器的竞争
二、在DMA中创建相关历程
首先我们打开STM32CudeMX,创建一个新的项目
然后我们进行芯片的选择,选择STM32F103RC芯片
之后我们选择芯片中的STM32F103RCTx,双击后等待
接下来我们进行 RCC的设置,首先点击System Core中的RCC
然后我们选择High Speed Clock 中的Cystal
之后我们进行串口的设置
首先进入connectivity
然后再点击Connectivity下的USATR1
然后我们设置MODE为异步通信(Asynchronous)
之后我们调整一下基础参数:将波特率调整为115200 Bits/s,把传输数据长度设置为8 Bit。奇偶检验调整到无,停止位1 的接收
之后点击NVIC Settings使其中断
随后我们进行DMA设置
首先点击DMASettings 下的 Add 添加通道,将传输速率设置为中速
之后我们将模式设置为Normal,右侧选择Memory
之后在System view下选择DMA
我们在左侧点击ADD的添加
然后我们点击add进行添加
然后进行时钟设置
先把HSI换成HSE,然后将PLLMUL调成*9
然后我们把此处调到PLLCLK
然后我们再调整一下APB1 Prescaler,把它改成/2
然后我们选择Project Manager进行工程名和IDE的版本的设置
之后我们将IDE改成MDK-ARM
Location处千万要选择全英文路径,否则会出现错误
之后我们点击右上角的generate code
三、代码的改写
我们在点击右上角的generate code后,打开代码中的main.c
之后我们在图示位置添加以下代码:
uint8_t Senbuff[] = "Hello world!"; //定义数据发送数组
再在下图位置添加如下代码:
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);
然后我们进行编译
之后我们进行烧录
再用串口助手发送
四、总结
通过本次实验我们更好地了解到了STM32采用串口DMA方式的相关内容
一、DMA的介绍
1.DMA由来
DMA(Direct Memory Access,直接存储器访问)。在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式、中断传送方式。CPU是通过系统总线与其他部件连接并进行数据传输。
1.1程序传送方式
程序传送方式是指直接在程序控制下进行数据的输入/输出操作。分为无条件传送方式和查询(条件传送方式)两种。
1.1.1无条件传送方式
微机系统中的一些简单的外设,如开关、继电器、数码管、发光二极管等,在它们工作时,可以认为输入设备已随时准备好向CPU提供数据,而输出设备也随时准备好接收CPU送来的数据,这样,在CPU需要同外设交换信息时,就能够用IN或OUT指令直接对这些外设进行输入/输出操作。由于在这种方式下CPU对外设进行输入/输出操作时无需考虑外设的状态,故称之为无条件传送方式。
1.1.2查询(有条件)传送方式
查询传送也称为条件传送,是指在执行输入指令(IN)或输出指令(OUT)前,要先查询相应设备的状态,当输入设备处于准备好状态、输出设备处于空闲状态时,CPU才执行输入/输出指令与外设交换信息。为此,接口威廉希尔官方网站 中既要有数据端口,还要有状态端口。
1.2中断传送方式
中断传送方式是指当外设需要与CPU进行信息交换时,由外设向CPU发出请求信号,使CPU暂停正在执行的程序,转而去执行数据输入/输出操作,待数据传送结束后,CPU再继续执行被暂停的程序。
以上两种方式,均由CPU控制数据传输,不同的是程序传送方式由CPU来查询外设状态,CPU处于主动地位,而外设处于被动地位。这就是常说的----对外设的轮询,效率低。而中断传送法师则是外设主动向CPU发生请求,等候CPU处理,在没有发出请求时,CPU和外设都可以独立进行各自的工作。 需要进行断点和现场的保护和恢复,浪费了很多CPU的时间,适合少量数据的传送。
1.3 DMA原理
DMA的出现就是为了解决批量数据的输入/输出问题。DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。这样数据的传送速度就取决于存储器和外设的工作速度。
通常系统总线是由CPU管理的,在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态(高阻状态),而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。因此DMA控制器必须有以下功能:
1、能向CPU发出系统保持(HOLD)信号,提出总线接管请求;
2、当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;
3、能对存储器寻址及能修改地址指针,实现对内存的读写;
4、能决定本次DMA传送的字节数,判断DMA传送是否借宿。
5、发出DMA结束信号,使CPU恢复正常工作状态。
DMA传输将从一个地址空间复制到另外一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。 典型例子---移动一个外部内存的区块到芯片内部更快的内存区。
对于实现DMA传输,它是由DMA控制器直接掌管总线(地址总线、数据总线和控制总线),因此,存在一个总线控制权转移问题
DMA传输开始前: CPU------>DMA控制器
DMA传输结束后: DMA控制器------>CPU
一个完整的DMA传输过程必须经历DMA请求、DMA响应、DMA传输、DMA结束4个步骤。
DMA方式是一种完全由硬件进行组信息传送的控制方式,具有中断方式的优点,即在数据准备阶段,CPU与外设并行工作。
2.DMA的传送过程
DMA的数据传送分为预处理、数据传送和后处理3个阶段。
(1)预处理
由CPU完成一些必要的准备工作。首先,CPU执行几条I/O指令,用以测试I/O设备状态,向DMA控制器的有关寄存器置初值,设置传送方向、启动该设备等。然后,CPU继续执行原来的程序,直到I/O设备准备好发送的数据(输入情况)或接受的数据(输出情况)时,I/O设备向DMA控制器发送DMA请求,再由DMA控制器向CPU发送总线请求(统称为DMA请求),用以传输数据。
(2)数据传送
DMA的数据传输可以以单字节(或字)为基本单位,对于以数据块为单位的传送(如银盘),DMA占用总线后的数据输入和输出操作都是通过循环来实现。需要特别之处的是,这一循环也是由DMA控制器(而不是通过CPU执行程序)实现的,即数据传送阶段是完全由DMA(硬件)来控制的。
(3)后处理
DMA控制器向CPU发送中断请求,CPU执行中断服务程序做DMA结束处理,包括检验送入主存的数据是否正确,测试传送过程中是否出错(错误则转入诊断程序)和决定是否继续使用DMA传送其他数据块等。
3.在STM32F407中使用DMA
3.1使用大约步骤
1、使能DMA时钟,并等待数据流可配置。 使能DMA时钟,才可配置DMA相关的寄存器。要对DMA的配置寄存器DMA_SxCR进行配置,则要等其最低位为0----即DMA传输禁止,才可配置。
2、DMA_SxCR(指定的外设--x)设置该流x,包括配置通道,外设地址,存储器地址,传输数据量、优先级等。
3、使能外设的DMA功能
4、使能DMA数据流,启动传输。
5、查询DMA传输状态。
3.2 从DMA配置时最为关键的寄存器出发
DMA数据流x配置寄存器(DMA_SxCR)
CHSEL[2:0] 3位8个通道选择,即对于流x选择哪个通道
PL[1:0] 2位,设置流x的软件优先级,DMA控制器的仲裁器根据软件优先级,辅以硬件优先级来仲裁进行哪个数据流哪个通道的数据传输。
MSIZE[1:0] 2位,存储器的数据宽度(8位、16位、32位)
PSIZE[1:0] 2位,外设的数据宽度
MINC 1位, 设置存储器递增模式,存储器地址指针时递增还是固定
PINC 1位, 设置外设递增模式,外设地址指针递增还是固定
DIR 2位,数据传输方向
TCIE 1位,传输完成中断使能
HTIE 1位,半传输中断使能
TEIE 1位,传输错误中断使能
DMEIE 1位, 直接模式错误中断使能
EN 1位, 0禁止该数据流,此时可配置该数据流
1使能该数据,参与仲裁器的竞争
二、在DMA中创建相关历程
首先我们打开STM32CudeMX,创建一个新的项目
然后我们进行芯片的选择,选择STM32F103RC芯片
之后我们选择芯片中的STM32F103RCTx,双击后等待
接下来我们进行 RCC的设置,首先点击System Core中的RCC
然后我们选择High Speed Clock 中的Cystal
之后我们进行串口的设置
首先进入connectivity
然后再点击Connectivity下的USATR1
然后我们设置MODE为异步通信(Asynchronous)
之后我们调整一下基础参数:将波特率调整为115200 Bits/s,把传输数据长度设置为8 Bit。奇偶检验调整到无,停止位1 的接收
之后点击NVIC Settings使其中断
随后我们进行DMA设置
首先点击DMASettings 下的 Add 添加通道,将传输速率设置为中速
之后我们将模式设置为Normal,右侧选择Memory
之后在System view下选择DMA
我们在左侧点击ADD的添加
然后我们点击add进行添加
然后进行时钟设置
先把HSI换成HSE,然后将PLLMUL调成*9
然后我们把此处调到PLLCLK
然后我们再调整一下APB1 Prescaler,把它改成/2
然后我们选择Project Manager进行工程名和IDE的版本的设置
之后我们将IDE改成MDK-ARM
Location处千万要选择全英文路径,否则会出现错误
之后我们点击右上角的generate code
三、代码的改写
我们在点击右上角的generate code后,打开代码中的main.c
之后我们在图示位置添加以下代码:
uint8_t Senbuff[] = "Hello world!"; //定义数据发送数组
再在下图位置添加如下代码:
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);
然后我们进行编译
之后我们进行烧录
再用串口助手发送
四、总结
通过本次实验我们更好地了解到了STM32采用串口DMA方式的相关内容
举报
更多回帖
rotate(-90deg);
回复
相关问答
控制器
STM32F407
怎样
去
计算
stm32F407
中
PWM的频率
2021-10-20
2527
STM32F407
的ADC+
DMA
该如何
去
使用
呢
2021-10-18
1991
怎样
去
移植
stm32f407
的uClinux内核
呢
2021-10-26
2214
怎样
去
使用
stm32f
103的AFIO寄存
器
呢
2021-11-16
1592
怎样
去
设计一种基于
STM32F407
的直流无刷电机BLDC
控制
硬件威廉希尔官方网站 ?
2021-07-20
1261
STM32F407
控制器
有几个通用定时
器
呢
2021-11-15
3190
怎样
去
移植基于
STM32F407
的FATFS文件系统
呢
2021-10-18
2236
请问
怎样
去
使用
stm32f407
ccmram
2021-10-19
1817
STM32F407
DMA
请求映射能在哪里使用
2021-10-15
1602
有关
STM32F407
的外部中断基础知识总结
2021-11-16
1481
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分