久芯网

STM32G070的DMA功能,如何实现外部中断触发DMA传输数据到IO口上,IO口翻转

avatar huahuahnu 提问时间: 2023-08-25 22:11:47 / 未解决
我参考了H7的示例修改G0的,但没实现功能

代码配置
DMA

static void MX_DMA_Init(void)
{
       
  /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();

  hdma_memtomem_dma1_channel1.Instance = DMA1_Channel1;
  hdma_memtomem_dma1_channel1.Init.Request = DMA_REQUEST_GENERATOR0;
  hdma_memtomem_dma1_channel1.Init.Direction = DMA_MEMORY_TO_PERIPH;
  hdma_memtomem_dma1_channel1.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_memtomem_dma1_channel1.Init.MemInc = DMA_MINC_ENABLE;
  hdma_memtomem_dma1_channel1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  hdma_memtomem_dma1_channel1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  hdma_memtomem_dma1_channel1.Init.Mode = DMA_CIRCULAR;
  hdma_memtomem_dma1_channel1.Init.Priority = DMA_PRIORITY_LOW;
  if (HAL_DMA_Init(&hdma_memtomem_dma1_channel1) != HAL_OK)
  {
    Error_Handler();
  }
       
        /* Select Callbacks functions called after Transfer complete and Transfer error */
  //HAL_DMA_RegisterCallback(&hdma_memtomem_dma1_channel1, HAL_DMA_XFER_CPLT_CB_ID, TransferComplete);
  HAL_DMA_RegisterCallback(&hdma_memtomem_dma1_channel1, HAL_DMA_XFER_ERROR_CB_ID, TransferError);
       
  /* DMA interrupt init */
  /* DMA1_Channel1_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
       
        /*##-3- Configure and enable the DMAMUX Request generator  ####################*/
  dmamux_ReqGenParams.SignalID  = HAL_DMAMUX1_REQ_GEN_EXTI0;    /* External request signal is EXTI0 signal */
  dmamux_ReqGenParams.Polarity  = HAL_DMAMUX_REQ_GEN_FALLING;//HAL_DMAMUX_REQ_GEN_RISING;    /* External request signal edge is falling  */
  dmamux_ReqGenParams.RequestNumber = 1;                        /* 1 requests on each edge of the external request signal  */

  HAL_DMAEx_ConfigMuxRequestGenerator(&hdma_memtomem_dma1_channel1, &dmamux_ReqGenParams);

       
  /* NVIC configuration for DMAMUX request generator overrun errors*/
  HAL_NVIC_SetPriority(DMA1_Ch4_7_DMAMUX1_OVR_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(DMA1_Ch4_7_DMAMUX1_OVR_IRQn);


}



外部中断口PA0配置
static void EXTI_IRQHandler_Config(void)
{
  GPIO_InitTypeDef   GPIO_InitStructure;

  /* Enable GPIOC clock */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /* Configure PA.0 pin as input floating */
  GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStructure.Pull = GPIO_NOPULL;
  GPIO_InitStructure.Pin = GPIO_PIN_0;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

//        HAL_NVIC_SetPriority(EXTI0_1_IRQn, 3, 0);
//  HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);

}



主函数调用
MX_DMA_Init();
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  /* Reset transferErrorDetected to 0, it will be set to 1 if a transfer error is detected */
  transferErrorDetected = 0;
  /* Reset transferCompleteDetected to 0, it will be set to 1 if a transfer is correctly completed */
  transferCompleteDetected = 0;  

HAL_DMAEx_EnableMuxRequestGenerator (&hdma_memtomem_dma1_channel1);
       
  EXTI_IRQHandler_Config();       

  if (HAL_DMA_Start_IT(&hdma_memtomem_dma1_channel1, (uint32_t)&g_uitemp[0], (uint32_t)&LED4_GPIO_PORT->ODR, 2) != HAL_OK)
  {
    /* Transfer Error */
    Error_Handler();
  }
       
  /* Infinite loop */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    if (transferErrorDetected == 1)
    {
      /* Toggle LED4 with a period of 200 ms */
      //BSP_LED_Toggle(LED4);
      transferErrorDetected = 0;
    }
    if (transferCompleteDetected == 1)
    {
      /* Turn LED4 on*/
      //BSP_LED_On(LED4);
      transferCompleteDetected = 0;
    }
  }
  /* USER CODE END 3 */


如需获得 STM32G070 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

13个回答
  • avatar xmshao
    回答时间: 2023-08-25 22:29:55

    你再核对下DMA相关配置。另外,你确认下是否开启了系统配置控制器的时钟 __HAL_RCC_SYSCFG_CLK_ENABLE();

  • avatar huahuahnu
    回答时间: 2023-08-25 22:52:48
    xmshao 发表于 2021-8-6 17:39
    你再核对下DMA相关配置。另外,你确认下是否开启了系统配置控制器的时钟 __HAL_RCC_SYSCFG_CLK_ENABLE(); ...

    确认开了__HAL_RCC_SYSCFG_CLK_ENABLE();

  • avatar xmshao
    回答时间: 2023-08-25 23:22:39
    mumu_hnu 发表于 2021-8-9 10:39
    确认开了__HAL_RCC_SYSCFG_CLK_ENABLE();

  • avatar xmshao
    回答时间: 2023-08-25 23:55:15

    我刚才测试过,通过外部中断事件触发DMA,将数据从memory送到GPIO是可以的,回头我稍微整理下再分享出来,以供更多人使用。

  • avatar huahuahnu
    回答时间: 2023-08-26 00:16:07
    xmshao 发表于 2021-8-9 14:29
    我刚才测试过,通过外部中断事件触发DMA,将数据从memory送到GPIO是可以的,回头我稍微整理下再分享出来,以供 ...

    太感谢了,最好是完整的工程代码发一个,建议官方给的示例工程能多一些,每个功能点都有就好了,初学者很需要啊

  • avatar xmshao
    回答时间: 2023-08-26 00:36:15
    mumu_hnu 发表于 2021-8-9 16:57
    太感谢了,最好是完整的工程代码发一个,建议官方给的示例工程能多一些,每个功能点都有就好了,初学者 ...

    通过STM32外部中断触发DMA传输 (qq.com) 这个你看看,介绍了整个基于G4芯片的实现过程。

  • avatar huahuahnu
    回答时间: 2023-08-26 00:59:52
    xmshao 发表于 2021-8-10 11:31
    通过STM32外部中断触发DMA传输 (qq.com) 这个你看看,介绍了整个基于G4芯片的实现过程。

    参照帖子使用CubeMx设置生成的工程,主函数也添加了代码,IO还是没翻转,无奈了。。。。。。。。。

  • avatar huahuahnu
    回答时间: 2023-08-26 01:21:39
    xmshao 发表于 2021-8-10 11:31
    通过STM32外部中断触发DMA传输 (qq.com) 这个你看看,介绍了整个基于G4芯片的实现过程。

    这是代码,看不出哪有问题

  • avatar huahuahnu
    回答时间: 2023-08-26 01:39:25

    程序运行发生了DMA传输错误 (TE) 标志

  • avatar yklstudent
    回答时间: 2023-08-26 02:03:24

    遇到楼主一样的问题,STM32G071RBT6芯片,PC13引脚EXTI13就是无法触发DMA工作 有点懵了

  • avatar huahuahnu
    回答时间: 2023-08-26 02:33:26
    yklstudent 发表于 2021-8-11 21:04
    遇到楼主一样的问题,STM32G071RBT6芯片,PC13引脚EXTI13就是无法触发DMA工作 有点懵了 ...

    很无语啊,弄好几天了,如果你解决了就告诉我一下

  • avatar gerald
    回答时间: 2023-08-26 02:51:01
    mumu_hnu 发表于 2021-8-13 14:29
    很无语啊,弄好几天了,如果你解决了就告诉我一下

    可以参考下,遗憾的是这并不是一个解决方案。 G0系列的DMA与GPIO并没有总线相连,因此DMA控制器无法访**PIO寄存器。 可以测试将DMA目的地址更改为Memory或者USART的TDR,DMA在这些情况下可以正常工作,原因在于M0+对于GPIO使用了"special port",对比G0系列和G4系列的系统框图,你将会明白为什么后者可以成功,谢谢。

  • avatar xmshao
    回答时间: 2023-08-26 03:21:25
    gerald 发表于 2021-11-30 13:05
    可以参考下,遗憾的是这并不是一个解决方案。

    G0系列的DMA与GPIO并没有总线相连,因此DMA控制器 ...

    [md]你补充得对。 查看手册,G0跟G4在这个地方不一样,G0的DMA是没法访**PIO的,而G4可以。 STM32系列太多了,我们这些做开发的偶尔也难免会栽进去。

会员中心 微信客服
客服
回到顶部