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

// 接收完成,处理数据

}

相关推荐
VekiSon43 分钟前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
来自晴朗的明天2 小时前
14、光耦隔离电路(EL3H7)
单片机·嵌入式硬件·硬件工程
G***技2 小时前
杰和IB3-272:以低功耗高性能打造新一代工业智能交互核心
单片机·嵌入式硬件·物联网
czhaii3 小时前
STC AI8052U单片机特点
单片机
MAR-Sky3 小时前
keil5中数据的不同定义和单片机(以stc8为例)里的对应关系(idata,xdata,data,code)
单片机·嵌入式硬件
项目題供诗5 小时前
51单片机入门(八)
单片机·嵌入式硬件·51单片机
羽获飞5 小时前
从零开始学嵌入式之STM32——9.STM32的时钟系统
stm32·单片机·嵌入式硬件
飞睿科技6 小时前
乐鑫智能开关方案解析:基于ESP32-C系列的低功耗、高集成设计
嵌入式硬件·物联网·esp32·智能家居·乐鑫科技
来自晴朗的明天7 小时前
13、NMOS 电源防反接电路
单片机·嵌入式硬件·硬件工程
17(无规则自律)8 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件