硬汉嵌入式论坛

 找回密码
 立即注册
查看: 718|回复: 5
收起左侧

[DMA] H7的外部事件启动DMA传输异常

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2024-9-20 18:40:38 | 显示全部楼层 |阅读模式
硬汉大哥。我使用了STM32H7B0的EXIT0来启动DMA传输,配置如图,但是不知道怎能就是无法启动传输。   


HAL_DMAEx_EnableMuxRequestGenerator (&hdma_dma_generator0);                      /* 使能DMAMUX请求发生器 */
HAL_DMA_RegisterCallback(&hdma_dma_generator0,HAL_DMA_XFER_CPLT_CB_ID,bdma_pCallback);


HAL_DMA_Start(&hdma_dma_generator0,(uint32_t)spi2_tx_buffer,(uint32_t)&(SPI2->TXDR),SPI_PEAK_LEN);

配置

配置
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-9-21 09:48:13 | 显示全部楼层
DMAMUX的外部触发方式,这部分是不是没写,你的完整配置我看下

12.png
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-9-23 09:22:35 | 显示全部楼层
初始化DMA
/* Configure DMA request hdma_dma_generator0 on DMA1_Stream1 */
  hdma_dma_generator0.Instance = DMA1_Stream1;
  hdma_dma_generator0.Init.Request = DMA_REQUEST_GENERATOR0;
  hdma_dma_generator0.Init.Direction = DMA_MEMORY_TO_PERIPH;
  hdma_dma_generator0.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_dma_generator0.Init.MemInc = DMA_MINC_ENABLE;
  hdma_dma_generator0.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  hdma_dma_generator0.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  hdma_dma_generator0.Init.Mode = DMA_NORMAL;
  hdma_dma_generator0.Init.Priority = DMA_PRIORITY_LOW;
  hdma_dma_generator0.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  if (HAL_DMA_Init(&hdma_dma_generator0) != HAL_OK)
  {
    Error_Handler();
  }

  /* Configure the DMAMUX request generator for the selected DMA stream */
  pRequestGeneratorConfig.SignalID = HAL_DMAMUX1_REQ_GEN_EXTI0;
  pRequestGeneratorConfig.Polarity = HAL_DMAMUX_REQ_GEN_FALLING;
  pRequestGeneratorConfig.RequestNumber = 12;
  if (HAL_DMAEx_ConfigMuxRequestGenerator(&hdma_dma_generator0, &pRequestGeneratorConfig) != HAL_OK)
  {
    Error_Handler();
  }

//使能DMA MUX 和SPI与DMA的关联
void drv_exp_adc_sync_init(void)
{

        MODIFY_REG(hspi2.Instance->CR2, SPI_CR2_TSIZE, 12);
       
        SET_BIT(hspi2.Instance->CFG1, SPI_CFG1_TXDMAEN); //使能发送DMA请求
       
       
       
        __HAL_SPI_ENABLE(&hspi2);
       
        SET_BIT(hspi2.Instance->CR1, SPI_CR1_CSTART);
       
    HAL_DMAEx_EnableMuxRequestGenerator (&hdma_dma_generator0);                      /* 使能DMAMUX请求发生器 */
    HAL_DMA_RegisterCallback(&hdma_dma_generator0,HAL_DMA_XFER_CPLT_CB_ID,bdma_pCallback);
}


//启动dma
void start_exp_adc_sync(uint8_t *pdat, uint32_t  number, void(*pCtFunc)(void))
{
    pcb_read_complete = pCtFunc;
        HAL_DMA_Start(&hdma_dma_generator0,(uint32_t)spi2_tx_buffer,(uint32_t)&(GPIOF->ODR),SPI_PEAK_LEN);
}

回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-9-23 09:41:50 | 显示全部楼层
从DMA的寄存器来看,好像dma的触发信号就像是没有连接到配置的DMA上,因为加上外部触发后DMA的状态寄存器和传输计数器没有任何变化.
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2024-9-23 10:44:44 | 显示全部楼层
问题解决了,DMA配置是对的,不能触发的原因是STM32H7是外部中断触发DMA的,而不是外部事件触发DMA ,因此需要把IO配置成中断输入而不是事件输入,另外必须打开对应的NVIC控制器。这个问题也是挺奇怪的,我用BDMA2+DMAMUX2却不存在这样的问题只用吧IO设置成外部事件就可以触发DMA
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-9-24 09:26:48 | 显示全部楼层
thomas.luan 发表于 2024-9-23 10:44
问题解决了,DMA配置是对的,不能触发的原因是STM32H7是外部中断触发DMA的,而不是外部事件触发DMA ,因此需 ...

这个问题确实防不胜防,我一般很少配置外部中断事件,所以没遇到过问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-29 02:21 , Processed in 0.246877 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表