STM32H723 QSPI DMA
时间: 2025-01-09 14:46:22 浏览: 3
### STM32H723 QSPI DMA 数据传输配置教程
#### 配置概述
STM32H723 微控制器支持通过QSPI接口进行高速存储器访问,并可利用DMA实现高效的数据传输。为了确保最佳性能,建议使用MDMA(多功能DMA),因为该模块能够处理复杂的内存映射并支持TCM空间的操作[^1]。
#### 初始化设置
在开始之前,需确认已正确安装必要的库文件和支持包。对于基于HAL库的应用程序开发环境而言,这通常意味着已经包含了`stm32h7xx_hal_qspi.h`头文件以及相应的驱动函数定义。
#### 主要步骤说明
##### 使能时钟和资源分配
```c
// 开启QSPI外设及其关联GPIO端口的时钟
__HAL_RCC_QSPI_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE(); // 假定QSPI引脚位于PE上
```
##### GPIO初始化
```c
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOE_CLK_ENABLE();
/* Configure the QSPI pins */
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 |
GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}
```
##### QSPI初始化结构体填充
```c
static QSPI_HandleTypeDef hqspi;
void MX_QSPI_Init(void)
{
HQPI_InitTypeDef sConfig = {0};
hqspi.Instance = QUADSPI;
sConfig.ClockPrescaler = 1;
sConfig.FifoThreshold = 4;
sConfig.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
sConfig.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE;
sConfig.DualFlash = QSPI_DUALFLASH_DISABLE;
if (HAL_QSPI_Init(&hqspi, &sConfig) != HAL_OK){
Error_Handler(__FILE__, __LINE__);
}
}
```
##### 设置DMA通道用于QSPI通信
由于MDMA具备更强大的特性来满足复杂需求,这里推荐选用它作为首选方案:
```c
static MDMA_HandleTypeDef hmdma_qspi;
/* Initialize and configure the MDMA channel for QSPI transfers */
static void MX_MDMA_Init(void)
{
MDMA_ChannelConfTypeDef sChannelConfig = {0};
hmdma_qspi.Instance = MDMA_Channel1;
sChannelConfig.Request = MDMA_REQUEST_GPDMA1_CHANNEL0;
sChannelConfig.TransferTriggerMode = MDMA_BLOCK_TRANSFER_EOC;
sChannelConfig.Priority = MDMA_PRIORITY_LOW;
sChannelConfig.BufferTransferLength= 16;
sChannelConfig.SourceDataSize = MDMA_SOURCE_DATASIZE_WORD;
sChannelConfig.DestinationDataSize = MDMA_DESTINATION_DATASIZE_WORD;
sChannelConfig.SourceIncrementMode = MDMA_SRC_INC;
sChannelConfig.DestAddr = (uint32_t)&hqspi.Instance->DR;
sChannelConfig.DestIncMode = MDMA_DEST_FIXED;
sChannelConfig.NumberOfBytes = BUFFER_SIZE;
if(HAL_MDMACHAN_Init(&hmdma_qspi,&sChannelConfig)!= HAL_OK){
Error_Handler(__FILE__,__LINE__);
}
__HAL_LINKDMA(&hqspi,Dmarx,hmdma_qspi); // Link MDMA to QSPI RX
}
```
##### 启动数据传输过程
当一切准备就绪之后,可以通过调用如下API来进行实际的数据交换:
```c
if (HAL_QSPI_Transmit_DMA(&hqspi,(uint8_t*)TxBuffer,BUFFER_SIZE)!= HAL_OK){
Error_Handler(__FILE__,__LINE__);
}
```
阅读全文