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=0
	DMA_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=1
	DMA_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=0
	DMA_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=1
	DMA_Cmd(DMA1_Stream4, DISABLE);
		
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习 day26(多标签分类,Adam算法,卷积层)

1. 多标签分类 多标签分类:对于单个输入特征,输出多个不同的标签y多类分类:对于单个输入特征,输出单个标签y,但y的可能结果有多个 2. 为多标签分类构建神经网络模型 我们可以构建三个不同的神经网络模型来分别预测…

C++第四讲

思维导图 仿照string类&#xff0c;实现myString类 /* ---------------------------------author&#xff1a;YoungZorncreated on 2023/7/19 19:20.--------------------------------- */ #include<iostream> #include<cstring>using namespace std;class myStri…

搜索引擎elasticsearch :安装elasticsearch (包含安装组件kibana、IK分词器、部署es集群)

文章目录 安装elasticsearch1.部署单点es1.1.创建网络1.2.加载镜像1.3.运行 2.部署kibana2.1.部署2.2.DevTools2.3 分词问题(中文不友好) 3.安装IK分词器3.1.在线安装ik插件&#xff08;较慢&#xff09;3.2.离线安装ik插件&#xff08;推荐&#xff09;1&#xff09;查看数据卷…

APP测试学习之Android模拟器Genymotion安装配置不上解决方法以及adb基本使用

Android模拟器Genymotion安装配置不上解决方法以及adb基本使用 Genymotion下载安装配置遇见的问题解决方法adb基本使用 Genymotion下载 1.首先进入官网 https://www.genymotion.com/ 2.在官网注册一个账号 https://www-v1.genymotion.com/account/login/ 3.下载 https://www.g…

Git源代码管理方案

背景 现阶段的Git源代码管理上有一些漏洞&#xff0c;导致在每次上线发布的时间长、出问题&#xff0c;对整体产品的进度有一定的影响。 作用 新的Git源代码管理方案有以下作用&#xff1a; 多功能并行开发时&#xff0c;测试人员可以根据需求任务分配测试自己的功能&#…

单片机第一季:零基础9——直流电机和步进电机

目录 1&#xff0c;直流电机 2&#xff0c;步进电机 1&#xff0c;直流电机 直流电机是指能将直流电能转换成机械能&#xff08;直流电动机&#xff09;或将机械能转换成直流电能&#xff08;直流发电机&#xff09;的旋转电机。它是能实现直流电能和机械能互相转换的电机。…

大模型开发(八):基于思维链(CoT)的进阶提示工程

全文共8000余字&#xff0c;预计阅读时间约16~27分钟 | 满满干货&#xff08;附复现代码&#xff09;&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;介绍提示工程基础类方法、思维链提示方法和LtM的提示方法&#xff0c;并复现解决论文中四个经典推理问题。 代码下载…

Spring实现文件上传,文件上传

第一步&#xff1a;创建jsp文件 创建form表单 提交文件是post 文件上传的表单 服务端能不能获得数据&#xff0c;能 实现单文件上传的步骤&#xff1a; 导入相应的坐标&#xff1a;在pom.xml文件中进行导入 再导入这份&#xff1a; 第二步&#xff0c;在spring-MVC的上传中去配…

React中使用Redux

1.为什么要使用redux redux是一个专门用于状态管理的一个库&#xff0c;和vue中的vuex功能类似。其中核心点就是状态的管理。虽然我们无论在vue还是在react中我们组件间的通行都可以使用消息总线或者父子组件间的消息传递来进行操作。但是如果我们需要A组件的状态在其他十个或者…

mongodb,redis,mysql 区别

一、MySQL 关系型数据库。 在不同的引擎上有不同 的存储方式。 查询语句是使用传统的sql语句&#xff0c;拥有较为成熟的体系&#xff0c;成熟度很高。 开源数据库的份额在不断增加&#xff0c;mysql的份额页在持续增长。 缺点就是在海量数据处理的时候效率会显著变慢。 二、Mo…

Linux·从 URL 输入到页面展现到底发生什么?

打开浏览器从输入网址到网页呈现在大家面前&#xff0c;背后到底发生了什么&#xff1f;经历怎么样的一个过程&#xff1f;先给大家来张总体流程图&#xff0c;具体步骤请看下文分解&#xff01; 总体来说分为以下几个过程: DNS 解析:将域名解析成 IP 地址TCP 连接&#xff1a…

学习babylon.js --- [2] 项目工程搭建

本文讲述如何搭建babylonjs的项目工程。 一 准备 首先创建一个目录叫MyProject&#xff0c;然后在这个目录里再创建三个目录&#xff1a;dist&#xff0c;public和src&#xff0c;如下&#xff0c; 接着在src目录里添加一个文件叫app.ts&#xff0c;本文使用typescript&#…

【蓝图】p28-p29按键+鼠标点击实现开关门

p28-p29按键鼠标点击实现开关门 p28&#xff0c;创建门的蓝图类创建一个Actor注意&#xff08;当门的中心点不在边角上时&#xff09; 蓝图三个旋转区别按E键开关门使鼠标点击也可以开门可能遇到的bug问题 p28&#xff0c;创建门的蓝图类 actor和组件的区别、门的轴心点修改 …

【测试开发】测试用例的设计方法

目录 一. 测试用例的基本要素 二. 测试用例的设计方法 1. 测试用例设计的万能公式 水杯测试用例 2. 基于需求的设计方法 邮箱注册测试用例 3. 等价类方法 有效等价类和无效等价类 等价类思想设计测试用例步骤 4. 边界值方法 边界值思想设计测试用例步骤 5. 判定表方法…

Docker——认识Docker 常用命令 Linux中安装docker 常见问题及其解决

目录 引出Docker是啥&#xff1f;Docker是啥&#xff1f;Docker VS 虚拟机1.特性优势2.资源优势 Docker的架构Docker常用命令&#xff08;0&#xff09;docker run&#xff08;1&#xff09;docker ps&#xff08;2&#xff09;docker stop 容器名称&#xff08;3&#xff09;…

DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程

目标检测系列的算法模型可以说是五花八门&#xff0c;不同的系列有不同的理论依据&#xff0c;DETR的亮点在于它是完全端到端的第一个目标检测模型&#xff0c;DETR&#xff08;Detection Transformer&#xff09;是一种基于Transformer的目标检测模型&#xff0c;由Facebook A…

华为ospf路由协议在局域网中的高级应用案例

关键配置&#xff1a; 1、出口为ospf区域0&#xff0c;下联汇聚依次区域1、2…&#xff0c;非骨干全部为完全nssa区域 2、核心&#xff08;abr&#xff09;上对非骨干区域进行路由汇总&#xff0c;用于解决出口两台路由的条目数量 3、ospf静默接口配置在汇聚下联接接入交换机的…

懒人自动化生成e2e测试文件:JSON => playwright

前言 本工具实现的是&#xff1a;使用简单的 JSON 配置&#xff0c;生成可执行的 playwright UI 测试文件。 然后通过项目内已经配置好的 playwright 配置实现 UI 测试。 工具工作流程&#xff1a; 期望达到的目的是&#xff1a; ✅ 基础页面&#xff08;进入页面&#xff0…

【Spring Boot学习一】创建项目 Spring Boot的配置文件

目录 一、安装插件 二、创建Spring Boot项目 1、创建项目 1.1 使用IDEA创建 1.2 网页版本创建 2、项目目录介绍与运行 三、Sping Boot的配置文件&#xff08;重点&#xff09; &#x1f337;1、.properties配置文件 &#xff08;1&#xff09;基础语法&#xff1a;Key …

session 生命周期和经典案例-防止非法进入管理页面

文章目录 session 生命周期和Session 经典案例-防止非法进入管理页面session 生命周期Session 生命周期-说明代码演示说明 Session 的生命周期创建CreateSession2创建ReadSession2 解读Session 的生命周期代码示例创建DeleteSession Session 经典案例-防止非法进入管理页面需求…