房山网站建设服务,网站如何做360优化,wordpress都可以干什么,产品网站推广目录 1. DMA结构体
STM32F103#xff1a;
STM32F407#xff1a; 2. F4系列实现存储器到存储器数据传输
1#xff09;结构体配置初始化
2#xff09;主函数
补充知识点#xff1a;关于变量存储的位置#xff0c;关于内部存储器一般存储什么内容
3. F4系列实现…目录 1. DMA结构体
STM32F103
STM32F407 2. F4系列实现存储器到存储器数据传输
1结构体配置初始化
2主函数
补充知识点关于变量存储的位置关于内部存储器一般存储什么内容
3. F4系列实现存储器到串口4数据传输
1结构体配置 初始化
2主代码实现串口4DMA请求以及使能DMA 1. DMA结构体
STM32F103
typedef struct
{uint32_t DMA_PeripheralBaseAddr; //外设地址uint32_t DMA_MemoryBaseAddr; //存储器地址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_M2M; //存储器到存储器
}DMA_InitTypeDef;
STM32F407
typedef struct
{uint32_t DMA_Channel; //通道 uint32_t DMA_PeripheralBaseAddr; //外设地址uint32_t DMA_Memory0BaseAddr; //存储器地址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; //uint32_t DMA_MemoryBurst; //存储器突发长度uint32_t DMA_PeripheralBurst; //外设突发长度
}DMA_InitTypeDef;2. F4系列实现存储器到存储器数据传输
1结构体配置初始化 STM32F47的DM1和DM2外设端口控制有所不同DM1不连接总线矩阵因此要实现存储器到存储器的数据传输只能使用DM2。而且在选择存储器到存储器传输时通道和数据流是可以随意选择的没有硬性规定选择哪个。 这里实现的存储器到存储器指flash到sram。
DMA配置:
void DMA_config(void)
{DMA_InitTypeDef DMA_Structure;//DMA2时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2复位 将CREN0DMA_DeInit(DMA2_Stream4);while (DMA_GetCmdStatus(DMA2_Stream4) ! DISABLE);//DMA结构体配置DMA_Structure.DMA_ChannelDMA_Channel_4;DMA_Structure.DMA_PeripheralBaseAddr(uint32_t)ArrayA;DMA_Structure.DMA_Memory0BaseAddr(uint32_t)ArrayB;DMA_Structure.DMA_DIRDMA_DIR_MemoryToMemory;DMA_Structure.DMA_BufferSizeSENDBUFF_SIZE;DMA_Structure.DMA_PeripheralDataSizeDMA_PeripheralDataSize_Byte;DMA_Structure.DMA_MemoryDataSizeDMA_MemoryDataSize_Byte;DMA_Structure.DMA_PeripheralIncDMA_PeripheralInc_Enable;DMA_Structure.DMA_MemoryIncDMA_MemoryInc_Enable;DMA_Structure.DMA_ModeDMA_Mode_Normal;DMA_Structure.DMA_PriorityDMA_Priority_High;DMA_Structure.DMA_FIFOModeDMA_FIFOMode_Disable;DMA_Structure.DMA_FIFOThresholdDMA_FIFOThreshold_1QuarterFull;DMA_Structure.DMA_PeripheralBurstDMA_PeripheralBurst_Single;DMA_Structure.DMA_MemoryBurstDMA_MemoryBurst_Single;//DMA初始化DMA_Init(DMA2_Stream4, DMA_Structure);//DMA使能 CREN1DMA_Cmd(DMA2_Stream4, ENABLE);}
2主函数
void main(void)
{DMA_config();
}
补充知识点关于变量存储的位置关于内部存储器一般存储什么内容 代码code和只读数据Ro-data存放在flash中。Ro-data为程序中定义的常量const在程序执行完成后内存系统自动释放。 读写的数据Rw-data和未初始化数据Zi-data存放在RAM中。
Rw-data表示已初始化的全局变量 栈区stack堆区heap全局区静态区static
Zi-data表示未初始化的全局变量 如下图所示最低内存地址到最高地址都是存放在内部的flash或者sram中。
1、栈区stack由编译器自动分配释放存放函数的参数值局部变量的值等。 2、堆区heap一般由程序员分配释放若程序员不释放程序结束时可能由OS释放。 3、全局变量、静态变量初始化的全局变量和静态变量放在一块区域未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程序结束后由系统自动释放。 4、文字常量常量字符串就是放在这里的。这些数据是只读的分配在RO-data(只读数据存储区)则被包含在flash中程序结束后由系统自动释放。
5、程序代码(code)存放函数体的二进制代码。 知识点参考原文链接https://blog.csdn.net/as480133937/article/details/87608816
3. F4系列实现存储器到串口4数据传输
1结构体配置 初始化
串口
void USART_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;//时钟DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK,ENABLE);DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK,ENABLE); //打开外设对应的RCC时钟//将PIN口配置成复用功能UART4 与F103不同GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_UART4);GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_UART4); //接口配置初始化//TX RX一起配置与F103不同GPIO_InitStructure.GPIO_PinDEBUG_USART_TX_GPIO_PIN ;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OTypeGPIO_OType_PP;GPIO_InitStructure.GPIO_PuPdGPIO_PuPd_UP;GPIO_Init(DEBUG_USART_TX_GPIO_PORT,GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin DEBUG_USART_RX_GPIO_PIN;GPIO_Init(DEBUG_USART_RX_GPIO_PORT,GPIO_InitStructure);//USART配置,初始化USART_InitStructure.USART_BaudRateDEBUG_USART_BAUDRATE;USART_InitStructure.USART_WordLengthUSART_WordLength_8b;USART_InitStructure.USART_StopBitsUSART_StopBits_1;USART_InitStructure.USART_ParityUSART_Parity_No;USART_InitStructure.USART_ModeUSART_Mode_Rx|USART_Mode_Tx;USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;USART_Init(DEBUG_USARTx, USART_InitStructure);中断优先级配置//NVIC_Configuration();//中断源接收产生中断USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,ENABLE);//串口使能开启串口USART_Cmd(DEBUG_USARTx,ENABLE); //相当于开启USART工作时钟让USART工作
}
DMA
void DMA_config(void)
{DMA_InitTypeDef DMA_Structure;//打开DMA1时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//复位 将CREN0DMA_DeInit(DMA1_Stream4);while (DMA_GetCmdStatus(DMA1_Stream4) ! DISABLE);//DMA结构体配置DMA_Structure.DMA_ChannelDMA_Channel_4;DMA_Structure.DMA_PeripheralBaseAddr(u32)((UART4-DR)); //为串口的DR寄存器地址DMA_Structure.DMA_Memory0BaseAddr(uint32_t)ArrayA;DMA_Structure.DMA_DIRDMA_DIR_MemoryToPeripheral;DMA_Structure.DMA_BufferSizeSENDBUFF_SIZE;DMA_Structure.DMA_PeripheralDataSizeDMA_PeripheralDataSize_Byte;DMA_Structure.DMA_MemoryDataSizeDMA_MemoryDataSize_Byte;DMA_Structure.DMA_PeripheralIncDMA_PeripheralInc_Disable;DMA_Structure.DMA_MemoryIncDMA_MemoryInc_Enable;DMA_Structure.DMA_ModeDMA_Mode_Normal;DMA_Structure.DMA_PriorityDMA_Priority_Medium;DMA_Structure.DMA_FIFOModeDMA_FIFOMode_Disable;DMA_Structure.DMA_FIFOThresholdDMA_FIFOThreshold_1QuarterFull;DMA_Structure.DMA_PeripheralBurstDMA_PeripheralBurst_Single;DMA_Structure.DMA_MemoryBurstDMA_MemoryBurst_Single;//DMA初始化DMA_Init(DMA1_Stream4, DMA_Structure);//DMA使能 CREN1DMA_Cmd(DMA1_Stream4, DISABLE);}
2主代码实现串口4DMA请求以及使能DMA
int main(void)
{USART_Config();DMA_config(); USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE);
}