硬汉嵌入式论坛

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

[技术讨论] STM32G070外部中断无法触发DMA传输数据到IO口上

[复制链接]

56

主题

131

回帖

299

积分

高级会员

积分
299
发表于 2021-8-11 13:51:24 | 显示全部楼层 |阅读模式
如题,有人使用过这个功能吗?求解答

PC13外部中断触发DMA把数据传输到GPIOA上,实现PA5输出脉冲,代码如下:

static void MX_DMA_Init(void)
{

  /* Local variables */
  HAL_DMA_MuxRequestGeneratorConfigTypeDef pRequestGeneratorConfig = {0};

  /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();

  /* Configure DMA request hdma_dma_generator0 on DMA1_Channel1 */
  hdma_dma_generator0.Instance = DMA1_Channel1;
  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_HALFWORD;
  hdma_dma_generator0.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  hdma_dma_generator0.Init.Mode = DMA_CIRCULAR;
  hdma_dma_generator0.Init.Priority = DMA_PRIORITY_LOW;
  if (HAL_DMA_Init(&hdma_dma_generator0) != HAL_OK)
  {
    Error_Handler( );
  }

  /* Configure the DMAMUX request generator for the selected DMA channel */
  pRequestGeneratorConfig.SignalID = HAL_DMAMUX1_REQ_GEN_EXTI13;
  pRequestGeneratorConfig.Polarity = HAL_DMAMUX_REQ_GEN_RISING;
  pRequestGeneratorConfig.RequestNumber = 1;
  if (HAL_DMAEx_ConfigMuxRequestGenerator(&hdma_dma_generator0, &pRequestGeneratorConfig) != HAL_OK)
  {
    Error_Handler( );
  }

}


static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : LED_GREEN_Pin */
  GPIO_InitStruct.Pin = LED_GREEN_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(LED_GREEN_GPIO_Port, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

}


int main(void)
{

  uint16_t DataSource[]={GPIO_PIN_5,0,GPIO_PIN_5,0};


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();


  /* Configure the system clock */
  SystemClock_Config();


  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();

  HAL_DMAEx_EnableMuxRequestGenerator(&hdma_dma_generator0);
       
HAL_DMA_Start(&hdma_dma_generator0,(uint32_t)&DataSource,(uint32_t)&(GPIOA->ODR),4);

  while (1)
  {

  }

}



main.c

7.83 KB, 下载次数: 3

stm32g0xx_hal_msp.c

2.52 KB, 下载次数: 2

stm32g0xx_it.c

4.53 KB, 下载次数: 1

回复

使用道具 举报

56

主题

131

回帖

299

积分

高级会员

积分
299
 楼主| 发表于 2021-8-11 15:00:34 | 显示全部楼层
程序运行发生了DMA传输错误 (TE) 标志
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-8-11 15:31:08 | 显示全部楼层
我之前给H7做了定时器触发方式,你可以先试试定时触发是否正常。这样可以确保你的DMAMUX配置是没问题的,然后排查你的外部中断问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 15:21 , Processed in 0.163922 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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