DMA 配置步骤:
使能 DMA 时钟
配置 DMA 通道参数 (传输方向、源地址、目标地址、传输量)
使能外设的 DMA 请求
启动 DMA 传输
DMA+ADC 应用:(连续采集数据到内存)
// ADC+DMA初始化
void ADC1_DMA_Init(void){
// ADC配置(扫描模式+连续转换)
hadc1.Init.ScanConvMode = ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.NbrOfConversion = 10; // 转换10个通道
// 配置DMA
DMA_HandleTypeDef hdma_adc;
hdma_adc.Instance = DMA1_Channel1;
hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY; // 外设到内存
hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址不变
hdma_adc.Init.MemInc = DMA_MINC_ENABLE; // 内存地址递增
hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; // 外设数据字对齐
hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; // 内存数据字对齐
hdma_adc.Init.Mode = DMA_CIRCULAR; // 循环模式
hdma_adc.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_adc);
// 关联DMA和ADC
__HAL_LINKDMA(&hadc1, DMA_Handle, hdma_adc);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 10); // 启动DMA转换
}
DMA+UART 应用:(发送大数据)
// 发送大数组(1KB)
uint8_t buffer[1024];
void UART_DMA_Send(void){
HAL_UART_Transmit_DMA(&huart1, buffer, sizeof(buffer));
}
// 接收完成回调(使用DMA+中断)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
// 接收完成,处理数据
}
5072

被折叠的 条评论
为什么被折叠?



