| 我参考了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 */ |
你再核对下DMA相关配置。另外,你确认下是否开启了系统配置控制器的时钟 __HAL_RCC_SYSCFG_CLK_ENABLE();
你再核对下DMA相关配置。另外,你确认下是否开启了系统配置控制器的时钟 __HAL_RCC_SYSCFG_CLK_ENABLE(); ...
确认开了__HAL_RCC_SYSCFG_CLK_ENABLE();
确认开了__HAL_RCC_SYSCFG_CLK_ENABLE();
我刚才测试过,通过外部中断事件触发DMA,将数据从memory送到GPIO是可以的,回头我稍微整理下再分享出来,以供更多人使用。
我刚才测试过,通过外部中断事件触发DMA,将数据从memory送到GPIO是可以的,回头我稍微整理下再分享出来,以供 ...
太感谢了,最好是完整的工程代码发一个,建议官方给的示例工程能多一些,每个功能点都有就好了,初学者很需要啊
太感谢了,最好是完整的工程代码发一个,建议官方给的示例工程能多一些,每个功能点都有就好了,初学者 ...
通过STM32外部中断触发DMA传输 (qq.com) 这个你看看,介绍了整个基于G4芯片的实现过程。
通过STM32外部中断触发DMA传输 (qq.com) 这个你看看,介绍了整个基于G4芯片的实现过程。
参照帖子使用CubeMx设置生成的工程,主函数也添加了代码,IO还是没翻转,无奈了。。。。。。。。。
通过STM32外部中断触发DMA传输 (qq.com) 这个你看看,介绍了整个基于G4芯片的实现过程。
这是代码,看不出哪有问题
程序运行发生了DMA传输错误 (TE) 标志
遇到楼主一样的问题,STM32G071RBT6芯片,PC13引脚EXTI13就是无法触发DMA工作 有点懵了
遇到楼主一样的问题,STM32G071RBT6芯片,PC13引脚EXTI13就是无法触发DMA工作 有点懵了 ...
很无语啊,弄好几天了,如果你解决了就告诉我一下
很无语啊,弄好几天了,如果你解决了就告诉我一下
可以参考下,遗憾的是这并不是一个解决方案。 G0系列的DMA与GPIO并没有总线相连,因此DMA控制器无法访**PIO寄存器。 可以测试将DMA目的地址更改为Memory或者USART的TDR,DMA在这些情况下可以正常工作,原因在于M0+对于GPIO使用了"special port",对比G0系列和G4系列的系统框图,你将会明白为什么后者可以成功,谢谢。
可以参考下,遗憾的是这并不是一个解决方案。G0系列的DMA与GPIO并没有总线相连,因此DMA控制器 ...
[md]你补充得对。 查看手册,G0跟G4在这个地方不一样,G0的DMA是没法访**PIO的,而G4可以。 STM32系列太多了,我们这些做开发的偶尔也难免会栽进去。