蓝桥杯嵌入式学习(六)DMA

一.引言

DMA(直接存储器访问):

可以提供外设和存储器或者存储器和存储器之间的高速数据传输方式,无需CPU参与,节省了CPU的资源。

DMA数据传输四要素:

1.传输源:DMA数据传输的来源

2.传输目标:DMA数据传输的目的

3.传输数量:传输DMA数据的数量

4.触发信号:启动一次DMA传输的动作

stm32DMA模块

stm32有两个DMA:DMA1和DMA2,它们都有12个通道,每个通道用于管理来自一个或多个外设的内存访问请求,每个DMA都有一个仲裁器,用于处理DMA请求之间的优先级

支持外设到内存,内存到外设,内存到内存,外设到外设的数据传输

每个通道与来自外设的DMA请求信号或内存到内存传输中的软件触发器相关联,此配置由软件完成

本节将使用ADC+DMA进行模拟信号采样

二.cubeMX配置

参考产品手册:

配置ADC1与ADC2

添加DMA

失能DMA中断

三.代码模块

在主函数初始化部分开启DMA

### 蓝桥杯嵌入式比赛串口通过DMA发送数据的实现 在蓝桥杯嵌入式比赛中,利用串口和DMA技术进行高效的数据传输是一种常见的需求。以下是关于如何实现串口通过DMA发送数据的具体方法以及示例代码。 #### 1. 配置UART与DMA 为了使能DMA模式下的串口通信,在CubeMX工具中需完成以下设置: - **启用UART外设**:选择相应的UART通道(如USART1),并将其工作模式设定为异步模式。 - **配置波特率和其他参数**:根据实际应用调整波特率、停止位、校验位等基本属性[^3]。 - **激活DMA支持**:勾选TX方向上的DMA选项,并分配合适的DMA流/通道资源用于管理数据缓冲区的操作过程。 #### 2. 初始化结构体定义 在程序初始化阶段,需要创建`UART_HandleTypeDef`类型的句柄变量来保存有关硬件状态的信息;同时也要声明一个全局数组作为DMA传输期间使用的发送缓存区域: ```c UART_HandleTypeDef huart1; uint8_t tx_data[] = "This is a test message via UART with DMA.\n"; ``` #### 3. 编写发送函数 下面展示了一个基于HAL库调用API接口实现的简单例子,它展示了怎样启动一次带有指定长度消息内容的DMA传送动作: ```c void SendDataUsingDMA(void){ if(HAL_UART_Transmit_DMA(&huart1, (uint8_t*)tx_data, sizeof(tx_data)-1)!= HAL_OK){ Error_Handler(); // 如果发生错误,则进入错误处理流程 } } ``` 此段代码片段的作用在于当被调用时会触发DMA控制器自动从内存地址指向的位置取出相应字节数量的数据并通过选定好的UART端口向外发出直到全部完成为止[^4]。 #### 4. 中断服务例程(ISR) 虽然上述部分已经涵盖了主要逻辑但是还需要注意一点就是每当有一个完整的块已经被成功转移到目标设备之后会产生一个事件通知主机从而允许进一步采取行动比如重新装载新的资料或者关闭整个事务等等这些都可以放在特定ISR内部去执行: ```c void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){ if(huart == &huart1){ // 此处可加入额外的任务控制语句例如点亮LED指示灯表明已完成一项作业之类的操作 } } ``` 以上即构成了一个较为完善的方案框架用来解决题目所提到的要求——借助于直接存储器访问机制提高效率的同时简化了传统轮询等待所带来的复杂度问题[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值