STM32U5系列的资料:STM32U595/5A5: 相关PDF文档
STM32U5系列的DMA
- GPDMA可以同时处理16个独立的数据传输任务,每个通道都有其自己的FIFO队列,用于排队源和目标传输。
- 通过可编程的GPDMA输入触发器与GPDMA任务完成事件的连接,可以实现通道间和通道内的传输链接。
- 对于每个链表项,可以单独编程源和目标传输,还可以编程源和目标之间的数据处理方式,如字节重排、打包或解包、填充或截断、符号扩展和左右对齐。
- 支持scatter-gather (multi-buffer transfers)
Continuous Conversion Mode:连续转换模式:使能
DMA Continuous Requests:DMA连续请求:使能
Go to GPDMA1
开启中断
配置链表:
串口打印ADC采样值,并转换为电压值,板载PC2测量的是VBUS_SENSE,ADC测量未接入TypeC时电压是0V,接入后是0.67V;
我的是cubeMX6.8.1生成的工程,没有链表头文件和ADC的VDDA电压开启,所以都需要单独引入和打开
程序首先引用头文件
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "linked_list.h"
/* USER CODE END Includes */
串口重定义,并且外部调用linked_list链表中的声明变量,定义一个转化数组
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF); return ch; }
extern DMA_NodeTypeDef ADCNode;
extern DMA_QListTypeDef ADCQueue;
extern ADC_HandleTypeDef hadc1;
extern DMA_HandleTypeDef handle_GPDMA1_Channel10;
#define ADC_CONVERTED_DATA_BUFFER_SIZE ((uint32_t) 32) /* Size of array aADCxConvertedData[] */
/* Variable containing ADC conversions data */
uint32_t aADCxConvertedData[ADC_CONVERTED_DATA_BUFFE
在main函数中配置ADC,并将ADC与链表进行链接
HAL_PWREx_EnableVddA();
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();
}
在while(1)中
printf("ADC VaL:%ld voltage:%.4f \r\n ", aADCxConvertedData[0], (float)(aADCxConvertedData[0])*3.3/16384);