Day36:DMA 配置与使用

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){
  // 接收完成,处理数据
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值