你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
huahuahnu 提问时间:2021-8-6 15:31 / 未解决
我参考了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 */

收藏 评论13 发布时间:2021-8-6 15:31

举报

13个回答
xmshao 回答时间:2021-8-6 17:39:11
你再核对下DMA相关配置。另外,你确认下是否开启了系统配置控制器的时钟 __HAL_RCC_SYSCFG_CLK_ENABLE();
huahuahnu 回答时间:2021-8-9 10:39:07
xmshao 发表于 2021-8-6 17:39
你再核对下DMA相关配置。另外,你确认下是否开启了系统配置控制器的时钟 __HAL_RCC_SYSCFG_CLK_ENABLE(); ...

确认开了__HAL_RCC_SYSCFG_CLK_ENABLE();
xmshao 回答时间:2021-8-9 14:26:03
mumu_hnu 发表于 2021-8-9 10:39
确认开了__HAL_RCC_SYSCFG_CLK_ENABLE();

Untitled.png
xmshao 回答时间:2021-8-9 14:29:12
我刚才测试过,通过外部中断事件触发DMA,将数据从memory送到GPIO是可以的,回头我稍微整理下再分享出来,以供更多人使用。
huahuahnu 回答时间:2021-8-9 16:57:32
xmshao 发表于 2021-8-9 14:29
我刚才测试过,通过外部中断事件触发DMA,将数据从memory送到GPIO是可以的,回头我稍微整理下再分享出来,以供 ...

太感谢了,最好是完整的工程代码发一个,建议官方给的示例工程能多一些,每个功能点都有就好了,初学者很需要啊
xmshao 回答时间:2021-8-10 11:31:15
mumu_hnu 发表于 2021-8-9 16:57
太感谢了,最好是完整的工程代码发一个,建议官方给的示例工程能多一些,每个功能点都有就好了,初学者 ...

通过STM32外部中断触发DMA传输 (qq.com)  

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

这个你看看,介绍了整个基于G4芯片的实现过程。

参照帖子使用CubeMx设置生成的工程,主函数也添加了代码,IO还是没翻转,无奈了。。。。。。。。。
huahuahnu 回答时间:2021-8-11 10:55:42
xmshao 发表于 2021-8-10 11:31
通过STM32外部中断触发DMA传输 (qq.com)  

这个你看看,介绍了整个基于G4芯片的实现过程。

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

Src.rar

下载

4.35 KB, 下载次数: 2, 下载积分: ST金币 -1

huahuahnu 回答时间:2021-8-11 14:59:38
程序运行发生了DMA传输错误 (TE) 标志
yklstudent 回答时间:2021-8-11 21:04:12
遇到楼主一样的问题,STM32G071RBT6芯片,PC13引脚EXTI13就是无法触发DMA工作
有点懵了
huahuahnu 回答时间:2021-8-13 14:29:14
yklstudent 发表于 2021-8-11 21:04
遇到楼主一样的问题,STM32G071RBT6芯片,PC13引脚EXTI13就是无法触发DMA工作
有点懵了
...

很无语啊,弄好几天了,如果你解决了就告诉我一下
gerald 回答时间:2021-11-30 13:05:47

mumu_hnu 发表于 2021-8-13 14:29
很无语啊,弄好几天了,如果你解决了就告诉我一下

可以参考下,遗憾的是这并不是一个解决方案。

G0系列的DMA与GPIO并没有总线相连,因此DMA控制器无法访**PIO寄存器。

可以测试将DMA目的地址更改为Memory或者USART的TDR,DMA在这些情况下可以正常工作,原因在于M0+对于GPIO使用了"special port",对比G0系列和G4系列的系统框图,你将会明白为什么后者可以成功,谢谢。

image.png

image.png

xmshao 回答时间:2021-11-30 18:00:22

gerald 发表于 2021-11-30 13:05
<strong>可以参考下,遗憾的是这并不是一个解决方案。</strong></p>
<p>G0系列的DMA与GPIO并没有总线相连,因此DMA控制器 ...

[md]你补充得对。

查看手册,G0跟G4在这个地方不一样,G0的DMA是没法访**PIO的,而G4可以。

STM32系列太多了,我们这些做开发的偶尔也难免会栽进去。

image.png

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版