Error[Lp015]: section placement failure内容占用溢出
STM32F7由USB FS读写QSPI flash
STM8L050J3使用SWIM下载方式,无法下载,总是报错
用SDRAM刷ltdc有白线会出现是啥情况
在keil中仿真程序时,结构体变量出现错乱
中断服务程序抖动
STM32L562DK探索板——如何启用蓝牙功能?
自己写驱动深入学习与调用Hal库的取舍
关于最近学习C语言回调和钩子函数的想法,以及对HAL库回调函数的困惑
STM32 上同时跑 LWIP 的 TCP 与 UDP 连接
微信公众号
手机版
查查看DMA的触发源有哪些
什么是 GPIO 事件?如何将事件绑定到外设
哪些外设可以触发DMA可以参考外设描述或者总线架构图。
至于DMA传输多快没有固定公式,与很多因素有关
- 具体 STM32 型号
- DMA 类型(DMA / BDMA / MDMA / GPDMA / DMA2D 等)
- 总线架构(AHB、APB、AXI、D1/D2/D3 domain)
- 外设与存储器访问宽度(8/16/32/64 bit)
- 是否有总线竞争
- 是否有 FIFO / burst 传输
- 源地址和目标地址所在的总线域
- 时钟频率
直接的方式就是测试一下如果是STM32F系列的单片机,GPIO无法直接触发DMA传输,但可以通过定时器的输入捕获模式间接实现。
如果是STM32H系列或G系列的单片机,则有DMAMUX功能来通过GPIO触发DMA传输。
将GPIO配置为事件输出模式,
GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;最后在配置DMA时将触发源改为DMAMUX
hdma.Init.Request = BDMA_REQUEST_GENERATOR0;然后配置DMAMUX,大概是调用
HAL_DMAEx_ConfigMuxRequestGenerator进行配置,可以实现当GPIO触发后,执行一次或多次DMA传输。整个过程都不会触发中断。
STM32单片机上支持数据传输的外设和定时器基本上都支持触发DMA请求,但是需要进行适当的配置来使得当特定事件执行时触发DMA请求。
DMA传输的速度并不是一个容易量化的参数,抛开那些拖慢传输速度低速外设(如串口),传输速度主要受限与数据搬运的那两条总线,即数据的输入通道和输出通道,可以去看看参考手册的System architecture章节。其中有各个通道的数据宽度。以STM32H7这样的单片机来说DMA传输甚至没有CPU直接传输来的快,但是DMA存在的意义不是快,而是它将CPU从重复的数据搬运工作中解放出来去做更重要的事。只有当外设的速度高于DMA的速度时(
UNDER_RUN故障)才考虑DMA传输速度是否需要优化,比如开启FIFO、增加burst、减少总线竞争。