STM32U5的DMA称之为GPDMA与LPDMA,在用户手册《RM0456》中有如下的介绍:
我们常称之为数据搬动工。
我们的ADC数据转换也可以通过GPDMA来实现不需要CPU来控制转换,我们只需要在需要时去把转换好的数据取出来就行了,非常之方便。
【配置】
1、在上次实现ADC单片转换的工程上修改两个配置,一是Conversion Data Management Mode,配置为DMA circular mode,二是DMA Continuous Requests使能。如下图所示。
2、打开GPDMA设置,我这里设置了GPDMA1的通道10。模式我这里选用循环(circual)
3、由于STM32U5的GPDMA需要用linked List来实现。所以需要添加自己的list配置:
在ADCNode节点中我配置了Request Configuration为GPDMA1——ADC1。长度为1word
4、在以上配置结束后,生成代码。
5、添加用户代码,主要是引用linked_linst.h头文件,声明变量,还有就是定义一个32长度的用于存放ADC转换结果的数组aADCxConvertedData。
#include "linked_list.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern ADC_HandleTypeDef hadc1;
extern DMA_HandleTypeDef handle_GPDMA1_Channel10;
extern DMA_NodeTypeDef ADCNode;
extern DMA_QListTypeDef ADCQueue;
#define ADC_CONVERTED_DATA_BUFFER_SIZE ((uint32_t) 32) /* Size of array aADCxConvertedData[] */
/* Variable containing ADC conversions data */
uint32_t aADCxConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE];
6、接着我配置ADCQueue,并使用 LINKDMA把hadc与GPDMA1——10连接起来。同时使能DMA转换,结果放在指定的数组之中。
MX_ADCQueue_Config();
__HAL_LINKDMA(&hadc1,DMA_Handle, handle_GPDMA1_Channel10);
if(HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel10, &ADCQueue) != HAL_OK)
{
Error_Handler();
}
if(HAL_ADC_Start_DMA(&hadc1, (uint32_t *)aADCxConvertedData, (ADC_CONVERTED_DATA_BUFFER_SIZE)) != HAL_OK)
{
Error_Handler();
}
7、测试代码,在主循环中,我使用串口打印出32个转换数据,来观察效果,下载程序后效果如下:
变化电压后,也反映非常的灵敏,说明GPDMA成功应用。