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){

// 接收完成,处理数据

}

相关推荐
Crazyong1 小时前
FreeRTOS-CPU使用率统计
单片机·嵌入式硬件
_Ningye8 小时前
STM32 — 6.1 TIM定时中断
stm32·单片机·嵌入式硬件
小白学电子_8 小时前
proteus仿真51单片机通过矩阵按键和数码管制作简单计算器
嵌入式硬件·51单片机·proteus
非鱼䲆鱻䲜10 小时前
vscode开发stm32添加新的头文件路径和包含源文件
ide·vscode·stm32·cmake·包含头文件·包含源文件
FreakStudio10 小时前
把 Flask 搬进 ESP32,高中生自研嵌入式 Web 框架 MicroFlask !
python·单片机·嵌入式·cortex-m3·异步编程·电子diy
AnalogElectronic10 小时前
RP2040 pico 实验6,光敏电阻传感器模块(LM393 比较器版)
单片机
17(无规则自律)11 小时前
【Linux驱动实战】:字符设备之ioctl与mutex全解析
linux·c语言·驱动开发·嵌入式硬件
电子工程师成长日记-C5111 小时前
51单片机4乘4计算器
单片机·嵌入式硬件·51单片机
梅尔文.古11 小时前
ADCU-Ethernet-以太网在AUTOSAR与Linux架构下对比
arm开发·单片机·汽车
没有医保李先生11 小时前
esp32和stm32的工程宏定义
stm32·单片机·嵌入式硬件