STM32F407-- DMA使用

目录

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复位 将CREN=0DMA_DeInit(DMA2_Stream4);while (DMA_GetCmdStatus(DMA2_Stream4) != DISABLE);//DMA结构体配置DMA_Structure.DMA_Channel=DMA_Channel_4;DMA_Structure.DMA_PeripheralBaseAddr=(uint32_t)ArrayA;DMA_Structure.DMA_Memory0BaseAddr=(uint32_t)ArrayB;DMA_Structure.DMA_DIR=DMA_DIR_MemoryToMemory;DMA_Structure.DMA_BufferSize=SENDBUFF_SIZE;DMA_Structure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;DMA_Structure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;DMA_Structure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;DMA_Structure.DMA_MemoryInc=DMA_MemoryInc_Enable;DMA_Structure.DMA_Mode=DMA_Mode_Normal;DMA_Structure.DMA_Priority=DMA_Priority_High;DMA_Structure.DMA_FIFOMode=DMA_FIFOMode_Disable;DMA_Structure.DMA_FIFOThreshold=DMA_FIFOThreshold_1QuarterFull;DMA_Structure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;DMA_Structure.DMA_MemoryBurst=DMA_MemoryBurst_Single;//DMA初始化DMA_Init(DMA2_Stream4, &DMA_Structure);//DMA使能 CREN=1DMA_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_Pin=DEBUG_USART_TX_GPIO_PIN ;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=GPIO_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_BaudRate=DEBUG_USART_BAUDRATE;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_InitStructure.USART_HardwareFlowControl=USART_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);//复位 将CREN=0DMA_DeInit(DMA1_Stream4);while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE);//DMA结构体配置DMA_Structure.DMA_Channel=DMA_Channel_4;DMA_Structure.DMA_PeripheralBaseAddr=(u32)(&(UART4->DR)); //为串口的DR寄存器地址DMA_Structure.DMA_Memory0BaseAddr=(uint32_t)ArrayA;DMA_Structure.DMA_DIR=DMA_DIR_MemoryToPeripheral;DMA_Structure.DMA_BufferSize=SENDBUFF_SIZE;DMA_Structure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;DMA_Structure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;DMA_Structure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;DMA_Structure.DMA_MemoryInc=DMA_MemoryInc_Enable;DMA_Structure.DMA_Mode=DMA_Mode_Normal;DMA_Structure.DMA_Priority=DMA_Priority_Medium;DMA_Structure.DMA_FIFOMode=DMA_FIFOMode_Disable;DMA_Structure.DMA_FIFOThreshold=DMA_FIFOThreshold_1QuarterFull;DMA_Structure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;DMA_Structure.DMA_MemoryBurst=DMA_MemoryBurst_Single;//DMA初始化DMA_Init(DMA1_Stream4, &DMA_Structure);//DMA使能 CREN=1DMA_Cmd(DMA1_Stream4, DISABLE);}

2)主代码:实现串口4DMA请求,以及使能DMA

int main(void)
{USART_Config();DMA_config();	USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++OpenCV(4):图像截取与掩膜操作

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 🔆 OpenCV项目地址及源代码:点击这里 文章目录 图像截取图像掩膜操作 图像截取 ROI操作,指的是:region of interest,感兴趣区域。 我们可以对一张…

Android Studio 修改AVD模拟器文件默认存储路径

AndroidStudio默认的模拟器文件路径为:C:\Users\用户名\.android\avd路径,通常windows系统上,C盘不是太大,而avd文件却不小,通常几个GB,所以有必要将avd路径换到一个非系统盘。 更换方法如下:H…

LocalDateTime、OffsetDateTime、ZonedDateTime之间的关系

什么是LocalDateTime? ISO-8601日历系统中不带时区的日期时间。 该类不存储时区,所以适合日期的描述,比如用于生日、deadline等等。 但是如果没有偏移量/时区等附加信息,一个时间是不能表示时间线上的某一时刻的。 什么是Offset…

20230720在ubuntu22.04系统下载+解密+合并ts切片的步骤(STEP-BY-STEP版本)

20230720在ubuntu22.04系统下载解密合并ts切片的步骤(STEP-BY-STEP版本) 2023/7/20 23:06 https://app1ce7glfm1187.h5.xiaoeknow.com/v2/course/alive/l_64af6130e4b03e4b54da1681?type2&app_idapp1cE7gLFM1187&pro_idterm_645c69388953e_Nhew…

论文工具——ChatGPT结合PlotNeuralNet快速出神经网络深度学习模型图

文章目录 引言正文PlotNeuralNet安装使用使用python进行编辑使用latex进行编辑 样例利用chatGPT使用chatGPT生成Latex代码利用chatGPT生成对应的python代码 总结引用 引言 介绍如何安装PlotNeuralNet工具,并结合chatGPT减少学习成本,快速出图。将按照软…

前端Web实战:从零打造一个类Visio的流程图拓扑图绘图工具

前言 大家好,本系列从Web前端实战的角度,给大家分享介绍如何从零打造一个自己专属的绘图工具,实现流程图、拓扑图、脑图等类Visio的绘图工具。 你将收获 免费好用、专属自己的绘图工具前端项目实战学习如何从0搭建一个前端项目等基础框架项…

java学习(二):反射

系列文章目录 https://editor.csdn.net/md/?articleId131757340 文章目录 系列文章目录参考【1】注解1. 什么是注解2. 内置注解3. 元注解4.自定义注解 【2】反射--基本概念一、反射的基本概念1. 为什么要用反射?2. 什么是反射?3. 用和不用反射的区别&a…

代码随想录-回溯(组合问题)|ACM模式

目录 前言: 77.组合 题目描述: 输入输出示例: 思路和想法: 216. 组合总和 III 题目描述: 输入输出示例: 思路和想法: 17. 电话号码的字母组合 题目描述: 输入输出描述&a…

MyBatis的多表操作

1 MyBatis的多表操作 1.1 多表模型介绍 我们之前学习的都是基于单表操作的,而实际开发中,随着业务难度的加深,肯定需要多表操作的。 多表模型分类 一对一:在任意一方建立外键,关联对方的主键。 一对多:在…

实用便捷!一站式BI系统推荐

在企业数字化转型过程中,BI系统可以建立业务、数据的双驱引擎,形成业务、数据的互补作用,通过建立数字化技术架构,明确企业的战略定位和业务目标,从而支撑实现这个目标。而一站式BI系统,则是指可以轻松从数…

【MySQL】SQL性能分析 (七)

🚗MySQL学习第七站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 假如我们需要对SQL进行优化,我们就必须对他足够的了解,比如 对哪一类SQL进行优化(增删改查…

基于物联网网关的工业数据可视化平台有什么功能?

随着数字化浪潮的不断发展,工业数据的价值越来越重要。在企业利用数据的过程中,数据可视化是数字化系统中十分重要的一部分。然而,工厂多种设备、多种协议影响到系统的搭建使得企业无法获得全面的数据视图,也无法对整个生产流程进…

OJ练习第142题——路径总和 II

113. 路径总和 II 力扣链接:113. 路径总和 II 题目描述 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 Java代码(深度优先搜…

六边形架构

六边形架构 微服务系统架构微服务定义微服务系统设计 传统分层架构六边形架构参考资料 微服务系统架构 需求描述做什么的问题,架构描述怎么做的问题(描述组成系统的各部件及其之间的关系) 微服务定义 下面的定义来自周志明老师的 凤凰架构 微服务是一种通过多个小型…

【Linux】 由“进程”过渡到“线程” -- 什么是线程(thread)?

知识引入初识线程1.什么叫做进程?2.什么叫做线程?3.如何看待我们之前学习的进程? 理解线程创建线程函数调用1.线程一旦被创建,几乎所有资源都是被线程所共享的2.与进程之间切换相比,线程的切换 初识线程总结&#xff1…

使用 Docker 快速上手中文版 LLaMA2 开源大模型

本篇文章,我们聊聊如何使用 Docker 容器快速上手朋友团队出品的中文版 LLaMA2 开源大模型,国内第一个真正开源,可以运行、下载、私有部署,并且支持商业使用。 写在前面 感慨于昨天 Meta LLaMA2 模型开放下载之后,Git…

操作系统练习:进程间通信(共享内存方式)

说明 本文是《操作系统概念(第九版)》3.4节“进程间通信”的练习。 进程间通信主要由两种模型: 共享内存消息传递 本文使用共享内存的方式实现进程间的通信 创建消息生产者 创建生产者的主要操作包括: 定义共享内存的大小、名称,以及通…

netty知识集锦2

粘包半包 粘包半包解决方案, 1短链接,它的消息边界是从链接建立到链接断开 2.定长解码器:服务器端选最大长度的消息作为定长,客户端不足补齐,缺点造成浪费 netty协议设计与解析 Message编码解码

AWS IAM介绍

前言 AWS是世界上最大的云服务提供商,它提供了很多组件供消费者使用,其中进行访问控制的组件叫做IAM(Identity and Access Management), 用来进行身份验证和对AWS资源的访问控制。 功能 IAM的功能总结来看,主要分两种&#xff1…

《零基础入门学习Python》第060讲:论一只爬虫的自我修养8:正则表达式4

有了前面几节课的准备,我们这一次终于可以真刀真枪的干一场大的了,但是呢,在进行实战之前,我们还要讲讲正则表达式的实用方法和扩展语法,然后再来实战,大家多把持一会啊。 我们先来翻一下文档:…