STM32H7 QSPI MDMA发送数据代码
时间: 2024-09-24 09:00:56 浏览: 42
STM32H7系列微控制器支持快速串行闪存(QSPI)模块,配合Memory Data Movement Unit(MDMA)可以高效地传输大量数据。下面是一个基本的使用示例,展示如何配置MDMA从QSPI发送数据:
```c
#include "stm32h7xx_hal.h"
// 假设我们有一个QSPI_HandleTypeDef qspiHandle,已经初始化完成
// 和一个DMA_HandleTypeDef dmaHandle,同样初始化并配置好
void qspi_mdmastart_send(uint8_t* tx_buffer, uint16_t length) {
// 配置DMA传输
DMA_HandleTypeDef *hdma = &dmaHandle;
hdma->Instance = ...; // DMA对应QSPI的通道
hdma->Init.Channel = ...; // 设置DMA通道
hdma->Init.Direction = DMA_DIR_PERIPH_TO_MEMORY; // 发送模式
hdma->Init.PeriphInc = DMA_PINC_DISABLE; // 不递增地址
hdma->Init.MemInc = DMA_MINC_ENABLE; // 内存地址递增
hdma->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 字节对齐
hdma->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 字节对齐
hdma->Init.Mode = DMA_NORMAL; // 普通模式
hdma->Init.Priority = DMA_PRIORITY_HIGH; // 高优先级
hdma->Init.FIFOMode = DMA_FIFOMODE_DISABLE; // 关掉FIFO
HAL_DMA_Init(hdma); // 初始化DMA
// 配置QSPI发送模式
QSPI_HandleTypeDef *hqspi = &qspiHandle;
hqspi->Instance = ...; // QSPI实例
hqspi->Init.Mode = QSPI_MODE_3; // 通常选择SPI模式3 (全双工)
hqspi->Init.DualWordLineMode = QSPI_DWLN_ENABLE; // 如果支持,启用双线模式
hqspi->Init.CSActiveState = QSPI_CS_ACTIVE_LOW; // CS低电平有效
hqspi->Init.BaudRatePrescaler = ...; // 根据需要设置时钟预分频
hqspi->Init.FirstBit = QSPI_FIRSTBIT_MSB; // 最高位先发
hqspi->Init.DummyCycles = 0; // 不使用额外的周期
HAL_QSPI_Init(hqspi); // 初始化QSPI
// 开启DMA传输
hdma->HDMA_FLAG = DMA_FLAG_TCIF0; // 设置触发条件为传输完成标志
__HAL_LINKDMA(qspiHandle, hdmadma, hdma); // 链接DMA到QSPI
HAL_DMA_Start_IT(hdma, (uint32_t)tx_buffer, (uint32_t)hqspi->Instance + QSPI_CR1_XFR_ADDRESS, length);
// 等待DMA传输完成
while (__HAL_DMA_GET Flag(hdma) != DMA_FLAG_TCIF0);
}
```
阅读全文