STM32 DMA和I/O端口

DMA ;

  • 7通道DMA控制器
  • 支持外设;定时器,ADC,SPI,I2C,USART。
    **7通道的意思是 ;先不用知道(手动狗头)。
DMA主要用途;

上一篇讲过,DMA帮助我们把ADC的数据直接放入SRAM中,方便我们后续读取和操作。DMA属于CPU小帮手,不用CPU的参与下就能够把数据存下来,或者传输到其他地方。

数据手册;

灵活的7路通用DMA可以管理在存储器到存储器,设备到存储器和存储器到设备的数据传输;DMA控制器支持环形缓冲区管理,避免了控制器传输到达缓冲区结尾时所产生的中断。
每个通道都有专门的硬件DMA请求逻辑,同时可以有软件触发每个通道;传输长度,传输的源地址和目标地址都可以通过软件单独设置。
DMA可以用于主要的外设;SPI,I2C,USART,通用基本和高级定时器TIMx和ADC。
在这里插入图片描述

多达80个快速I/O端口;

  • 26/37/51/80个I/O口,所有的I/O可以映像到16个外部中断;几乎所有端口均可兼容5V信号。
  • 中断-- 可以让单片机暂停当前的工作,去处理一个别的事情。
数据手册中;

GPIO;
每个GPIO引脚都可以有软件配置成输出(推挽/开漏),输入(带或不带上拉或下拉)或复用的外设功能端口,多数GPIO引脚都与数字或模拟的复用外设共用。除了具有模拟输入功能的端口,所有的GPIO引脚都有大电流通过能力。
在需要的情况下,I/O引脚的外设功能可以通过一个特定操作锁定,以避免意外的写入I/O寄存器。在APB2上的I/O引脚可大18MHz的翻转速度。

大电流多大?
APB2是内部通信总线。

typedef enum 
{
   GPIO_Mode_AIN = 0x0               // 模拟输入
   GPIO_Mode_IN_FLOATING=0x04        // 浮空输入
   GPIO_Mode_IPD = 0x28              // 下拉输入
   GPIO_Mode_IPU = 0x48              // 上拉输入
   GPIO_Mode_OUT_OD = 0x14           // 开漏输出
   GPIO_Mode_OUT_PP = 0x10           // 推挽输出
   GPIO_Mode_AF_OD = 0x1c            // 复用开漏输出
   GPIO_Mode_AF_PP = 0x18            // 复用推挽输出
   
}GPIO_Mode_Init
————————————————
版权声明:本文为优快云博主「小王 -挺忙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50212958/article/details/114949453

在这里插入图片描述

### STM32F407Z 微控制器中的 DMA 配置 STM32F407Z 微控制器配备了两个独立的 DMA 控制器(DMA1 DMA2),每个控制器拥有 8 个通道,总计提供 16 个数据流[^1]。这些数据流能够被分配给不同的外设以完成存储器访问请求的任务。 对于 I/O 端口的支持情况而言,具体取决于哪些外设启用了 DMA 功能以及它们如何映射到各个 DMA 数据流上。理论上讲,并不是所有的 GPIO 引脚都可以直接通过 DMA 进行操作;只有那些关联有支持 DMA 的外设功能(例如 USART、SPI 或 ADC)的引脚才可能间接利用 DMA 技术来优化数据传输效率[^2]。 需要注意的是,在涉及存储器间的数据搬运过程中存在一些特殊规则——比如当采用 DM1 实施此类任务时会受到一定限制,因为该设备未连接至总线矩阵从而无法单独胜任这类工作,而必须依靠 DM2 来达成目标。 综上所述,虽然硬件层面提供了多达 16 路可用作不同用途调配使用的 DMA 通路资源,但是实际能作为 DMA 传送机制所驱动之输入/输出接口的数量则需视乎项目设计里启用的具体外设种类及其对应关系而定。 ```python # 示例代码展示如何初始化一个简单的 DMA 流 (假设为 UART 接收模式下的 DMA 设置) import pyb uart = pyb.UART(2, baudrate=9600) dma_stream = pyb.DMA() def setup_dma_for_uart(): dma_stream.init(pyb.DMA.CIRCULAR, priority=pyb.DMA.HIGH) buffer_size = 100 rx_buffer = bytearray(buffer_size) uart.dma_enable(True) # 启用UART接收端的DMA功能 dma_stream.add_memory(rx_buffer, address_increment=True) setup_dma_for_uart() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王 -挺忙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值