
我参考了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突发传输功能时,传入指针从常量数组改为变量数组后,传输功能异常。测试官方用例一样,是何原因?
Group Study vs. Solo Study: What Works Best?
STM32U3 IIC通信后,SPI+GPDMA 进入循环发送,DMA无法使能 寄存器USEF=1
分享一个PWM+DMA的BUG
STM32G070CBT6使用硬件SPI无法读出W25Q128的ID
STM32的TIM触发SPI的DMA发送使用NSS时MSSI的问题
STM32G0B0CET6的usb的时钟只能用48MHz的晶振来实现吗?
PWM+DMA求助
STM32H743使用EXIT0触发SPI的DMA发送数据
STM32F373 SDAC1+DMA,数据只能更新一次?
确认开了__HAL_RCC_SYSCFG_CLK_ENABLE();
太感谢了,最好是完整的工程代码发一个
通过STM32外部中断触发DMA传输 (qq.com)
这个你看看,介绍了整个基于G4芯片的实现过程。
参照帖子使用CubeMx设置生成的工程,主函数也添加了代码,IO还是没翻转,无奈了。。。。。。。。。
这是代码,看不出哪有问题
Src.rar
2021-8-11 10:54 上传
点击文件名下载附件
下载积分: ST金币 -14.35 KB, 下载次数: 3, 下载积分: ST金币 -1
有点懵了
很无语啊,弄好几天了,如果你解决了就告诉我一下
可以参考下,遗憾的是这并不是一个解决方案。
G0系列的DMA与GPIO并没有总线相连,因此DMA控制器无法访**PIO寄存器。
可以测试将DMA目的地址更改为Memory或者USART的TDR,DMA在这些情况下可以正常工作,原因在于M0+对于GPIO使用了"special port",对比G0系列和G4系列的系统框图,你将会明白为什么后者可以成功,谢谢。
[md]你补充得对。
查看手册,G0跟G4在这个地方不一样,G0的DMA是没法访**PIO的,而G4可以。
STM32系列太多了,我们这些做开发的偶尔也难免会栽进去。