DMA和DMA实验(3.16)

本文详细介绍了STM32F103的DMA控制器,包括其通道数量、优先级设置、指针递增模式,并展示了三种实验示例:内存到内存搬运、内存到串口发送和串口接收搬运。DMA实验利用DMA功能实现异步数据传输,提高系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DMA介绍:

393af02e33bb437dbd1d2e1b81dc2641.png

1b9e2eff3b2348ea83c773313c778816.png

32ff4f33e69d4dd0a46ec7fda6e10483.png

 

 

DMA 控制器 STM32F103有2个:

DMA 控制器,DMA1有7个通道,DMA2有5个通道。 一个通道每次只能搬运一个外设的数据!! 如果同时有多个外设的 DMA 请求,则按照优先级进行响应。

DMA1有7个通道:

b0211baaa4794e60a405399568b5dcc0.png

 

DMA2有5个通道:

4737166895214886a005ec1bd0d345d5.png

优先级和传输方式:优先级设置一般用软件设置

2581e1a8ec154fc1a6e1ed4b6593cdfb.png

 

指针递增模式:

外设和存储器指针在每次传输后可以自动向后递增或保持常量。当设置为增量模式时,下一个要传输的地址 将是前一个地址加上增量值。

33de055c6f904978aba2d29b9d2a71f9.png

 

 

 

1.DMA实验,内存到内存搬运:

要求:使用DMA的方式将数组A的内容复制到数组B中,搬运完之后将数组B的内容打印到屏幕。

CubeMX配置 ,DMA 配置:

8276ea3d174f4b1f8c0bd5ae2ae241ae.png

 

用到的库函数

1. HAL_DMA_Start

25792b96f0cc4b90bfc1d6c9b5fcf4d7.png

 

2. __HAL_DMA_GET_FLAG

69a6d4ec2fc848c69a5a10a02bd12807.png

 

代码实现:

变量定义:

25097d45d9d844a39747c362f8e7e04f.png

 

main函数:

473498c4436b4dcca43830bf42048087.png

需要注意HAL_DMA_Start函数第四个参数要乘以sizeof(uint32_t),单位为字节。

而且使用printf函数需要以下这段代码,并且打开MicroLIB库。

int fputc(int ch, FILE *f)
{
unsigned char temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,0xffff);
return ch;

 

 

 

2.内存到外设搬运:

实验要求:使用DMA的方式将内存数据搬运到串口1发送寄存器,同时闪烁LED1。

 

CubeMX配置:第二个红框选择Circular模式ec526bd76b1c45a9984160866f3263b9.png764da8cd1c264f529a75acd3cc12cebe.png

 

用到的库函数:

20fd0b8b94ef4874a4a1a9374d69c3e4.png

代码实现:

7762e05777fa4e1a86aff7aa9272756f.png

HAL_UART_Transmit_DMA函数中,第三个参数单位为字节,sendBuf里面一个元素是一个字节,所以这里直接用BUF_SIZE

 

 

 

3.外设到内存搬运:

实验要求:使用DMA的方式将串口接收缓存寄存器的值搬运到内存中,同时闪烁LED1。

cubeMX配置:

c6d71f7ac9564b7ba8035f3a45847e48.png

 

用到的库函数:

1. __HAL_UART_ENABLE_IT

81d285ac97ac43339110ecd955b23a5b.png

2. HAL_UART_Receive_DMA

fa64774797944a95819d692f27b91ae8.png

3. __HAL_UART_GET_FLAG

fc3aa2e05b9b4b6499fd0f5ea127258f.png

4. __HAL_UART_CLEAR_IDLEFLAG

f3cfb67f7c3649ad936da2d74681dfb0.png

5. HAL_UART_DMAStop

c3860081b80b426495e76b1e120f86bc.png

6. __HAL_DMA_GET_COUNTER

aa3e134fdf12412c80e08d7a8d018b75.png

 

代码实现:

b83f683bf03b4dd5b05f4018ae022da2.png

3daf6e3f8f024908869f758c34470bc8.png

7a43a9ee52bc475aabdbd4375afacfe0.png

 

DMA实验说明,DMA的数据处理独立于MCU之外,在执行主函数同时,也能进行数据搬运。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值