收藏0 举报
typedef struct { uint32_t DMA_Channel; 通道选择 uint32_t DMA_PeripheralBaseAddr; 外设地址 uint32_t DMA_Memory0BaseAddr; 存储器 0 地址 uint32_t DMA_DIR; 传输方向 uint32_t DMA_BufferSize; 数据数目 uint32_t DMA_PeripheralInc; 外设递增 uint32_t DMA_MemoryInc; 存储器递增 uint32_t DMA_PeripheralDataSize; 外设数据宽度 uint32_t DMA_MemoryDataSize; 存储器数据宽度 uint32_t DMA_Mode; 模式选择 uint32_t DMA_Priority; 优先级 uint32_t DMA_FIFOMode; FIFO 模式 uint32_t DMA_FIFOThreshold; FIFO 阈值 uint32_t DMA_MemoryBurst; 存储器突发传输 uint32_t DMA_PeripheralBurst; 外设突发传输 } DMA_InitTypeDef;
DMA 存储器到串口1模式/ uint8_t SendBuff[SENDBUFF_SIZE]; void USART1_TX_DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure; /*开启DMA时钟*/ RCC_AHB1PeriphClockCmd(USART1_DMA_CLK, ENABLE); /* 复位初始化DMA数据流 */ DMA_DeInit(USART1_TX_DMA_STREAM); /* 确保DMA数据流复位完成 */ while (DMA_GetCmdStatus(USART1_TX_DMA_STREAM) != DISABLE) { } /*usart1 tx对应dma2,通道4,数据流7*/ DMA_InitStructure.DMA_Channel = USART1_DMA_CHANNEL; /*设置DMA源:串口数据寄存器地址*/ DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_BASE; /*内存地址(要传输的变量的指针)*/ DMA_InitStructure.DMA_Memory0BaseAddr = (u32)SendBuff; /*方向:从内存到外设*/ DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/ DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE; /*外设地址不增*/ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*内存地址自增*/ DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*外设数据单位*/ DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /*内存数据单位 8bit*/ DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*DMA模式:不断循环*/ //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; /*优先级:中*/ DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; /*禁用FIFO*/ DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; /*存储器突发传输 单次传输*/ DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; /*外设突发传输 单次传输*/ DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; /*配置DMA2的数据流7*/ DMA_Init(USART1_TX_DMA_STREAM, &DMA_InitStructure); /*使能DMA*/ DMA_Cmd(USART1_TX_DMA_STREAM, ENABLE); /* 等待DMA数据流有效*/ while(DMA_GetCmdStatus(USART1_TX_DMA_STREAM) != ENABLE); } uint8_t RevBuff[REVBUFF_SIZE]; void USART1_RX_DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure; /*开启DMA时钟*/ RCC_AHB1PeriphClockCmd(USART1_DMA_CLK, ENABLE); /* 复位初始化DMA数据流 */ DMA_DeInit(USART1_RX_DMA_STREAM); /* 确保DMA数据流复位完成 */ while (DMA_GetCmdStatus(USART1_RX_DMA_STREAM) != DISABLE) { } /*usart1 tx对应dma2,通道4,数据流2*/ DMA_InitStructure.DMA_Channel = USART1_DMA_CHANNEL; /*设置DMA源:串口数据寄存器地址*/ DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_BASE; /*内存地址(要传输的变量的指针)*/ DMA_InitStructure.DMA_Memory0BaseAddr = (u32)RevBuff; /*方向:从外设到内存*/ DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; /*传输大小DMA_BufferSize=REVBUFF_SIZE*/ DMA_InitStructure.DMA_BufferSize = REVBUFF_SIZE; /*外设地址不增*/ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*内存地址自增*/ DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*外设数据单位*/ DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /*内存数据单位 8bit*/ DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*DMA模式:不断循环*/ //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /*优先级:中*/ DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; /*禁用FIFO*/ DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; /*存储器突发传输 单次传输*/ DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; /*外设突发传输 单次传输*/ DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; /*配置DMA2的数据流2*/ DMA_Init(USART1_RX_DMA_STREAM, &DMA_InitStructure); /*使能DMA*/ DMA_Cmd(USART1_RX_DMA_STREAM, ENABLE); /* 等待DMA数据流有效*/ while(DMA_GetCmdStatus(USART1_RX_DMA_STREAM) != ENABLE); }
#ifndef __BSP_DMA_H #define __BSP_DMA_H #include "stm32f4xx.h" #include "bsp_led.h" #include "bsp_systick.h" #define as 0 /*存储器到外设串口1TX*/ #define USART1_DR_BASE (uint32_t)&(USART1->DR) //数据发送到 USART_DR 寄存器,该寄存器相对 USART 偏移地址为0x04 #define SENDBUFF_SIZE 5000 //发送的数据量 小于65535 #define USART1_DMA_CLK RCC_AHB1Periph_DMA2 #define USART1_DMA_CHANNEL DMA_Channel_4 //通道4 #define USART1_TX_DMA_STREAM DMA2_Stream7 //数据流 7 /*存储器到外设串口1RX*/ #define USART1_DR_BASE (uint32_t)&(USART1->DR) //数据发送到 USART_DR 寄存器,该寄存器相对 USART 偏移地址为0x04 #define REVBUFF_SIZE 5 //发送的数据量 小于65535 #define USART1_DMA_CLK RCC_AHB1Periph_DMA2 #define USART1_DMA_CHANNEL DMA_Channel_4 //通道4 #define USART1_RX_DMA_STREAM DMA2_Stream2 //数据流 2 void USART1_TX_DMA_Config(void); void USART1_RX_DMA_Config(void); #endif
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
20
323
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号