STM32 DMA 应用之(一)SRAM 与flash 间数据传输

发布者:温馨小屋最新更新时间:2016-12-23 来源: eefocus关键字:STM32  DMA  SRAM  flash  数据传输 手机看文章 扫描二维码
随时随地手机看文章

一、为什么要用DMA?

DMA 全称:Direct MemoryAccess 就是可以直接内存存取;

正是它可以直接操作内存所以具备以下优点:

而无需经过CPU去操作内存的存取,这样可以解放CPU出来干其他的事情;

因为他可以进行存储器时间的数据传输,而不需经过cpu,所以大大加快了数据传输速度—是一种高速的数据传输;


二.DMA有几种传输数据方式:

(1)内存到 内存之间的;即:SRAM?à SRAM

(2)内存到 外设之间的; (例如:串口收到的数据 从数据寄存器 à 内存)

(3) 外设到内存之间的;


三.传输的数据宽度是怎样的,数据是什么样的形式传输?DMA 能传输多大的数据量?

A. 数据源地址到数据目的地址 传输宽度或者说传输数据的形式,有几种:1)字节;2)半字;3)全字 [1字节=8bit 1半字=2字节=16位 1全字=2半字=4字节=32位]

B.传输的最大数据量是65536


我们来看一下stm32f103ve的数据手册第九章DMA 大概的了解一下DMA的特性:

四、怎样配置软件来使用DMA 

/****************************************************************/

函数名称: Dma_Init *功能描述: 利用DMA 把内存的数据 传输到flash 达到高速传输的目的 

* *输入参数:无 *返回值 :无 *其他说明:无 *当前版本:v1.0 

*作者 :尹宣 *完成时间:2013年12月1日  * 

*----------------------------------------------------------------- * ******************************************************************/ 

void Dma_Init(void) 

DMA_InitTypeDef DMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* DMA channel6 configuration */ 

DMA_DeInit(DMA1_Channel1); 

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SRC_Const_Buffer; //外设地址 

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DST_Buffer; //内存地址 

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为DMA的源端 

DMA_DIR_PeripheralDST; //外设作为目的地址 

DMA_InitStructure.DMA_BufferSize = BufferSize; //传输大小 

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable; //外设地址增加 

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增使能 

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //内存存储方式:字节 

DMA_MemoryDataSize_Word;//字(32位) 

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; 

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //DMA_Mode_Normal 正常模式,只传送一次; DMA_Mode_Circular:循环模式,不停的传送;       DMA_InitStructure.DMA_Priority = DMA_Priority_High; 

DMA_InitStructure.DMA_M2M = DMA_M2M_Enable; 

DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA Channel1 Transfer Complete interrupt */ 

DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); /* Get Current Data Counter value before transfer begins */ 

CurrDataCounter= DMA_GetCurrDataCounter(DMA1_Channel1); /* Enable DMA Channel6 transfer */ DMA_Cmd(DMA1_Channel1, ENABLE);

 } 

2.设置DMA优先级

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/***************************************************************** 
*函数名称:  NVIC_Config 
*功能描述:  配置DMA的中断优先级
*  
*输入参数:无
*返回值  :无
*其他说明:无
*当前版本:v1.0 
*作者  :尹宣
*完成时间:2013年12月1日
*修改日期       版本号     修改人     修改内容
*----------------------------------------------------------------- 
******************************************************************/ 
voidNVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
     
    /* Configure one bit for preemption priority -------------------------------- */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
 
     /* Enable DMA channel1 IRQ Channel */
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


3.在stm3210x_it.c 文件中添加 DMA中断处理函数

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*******************************************************************************
* Function Name  : DMAChannel1_IRQHandler
* Description    : This function handles DMA Stream 1 interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
      
voidDMA1_Channel1_IRQHandler(void)
    /* Test on DMA Channel1 Transfer Complete interrupt */
  if(DMA_GetITStatus(DMA1_IT_TC1))     //DMA1_IT_TC1:通道1传输完成中断
  {
    /* Get Current Data Counter value after complete transfer */
   CurrDataCounter= DMA_GetCurrDataCounter(DMA1_Channel1);  //返回当前DMA通道1 剩余的待传输的数据数目
    /* Clear DMA Channel1 Half Transfer, Transfer Complete and Global interrupt pending bits */
    DMA_ClearITPendingBit(DMA1_IT_GL1);    //清中断1全局中断
  }
     
}


4主函数部分:


?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
intmain(void)
{  
    intcount;
     
    NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x00); // NVIC_VectTab_FLASH=0x08000000
//  RCC_Config();
    SysTick_Init();
    GPIO_Config();
    USART1_Init(19200);
     
    NVIC_Config();
     
    Dma_Init();
    /* Get Current Data Counter value before transfer begins */
    CurrDataCounter= DMA_GetCurrDataCounter(DMA1_Channel1); //·μ??μ±?°DMAí¨μàx, ê£óà′y′?ê?êy?Yêy??
     
    while( CurrDataCounter!=0) ;
 
 
    Delay_ms(1);
     
}



关键问题

问1:

使用内存窗口观测SRC_Const_Buffer和DST_Buffer所在的位置,可以发现SRC_Const_Buffer

地址为0x08001384,,即Flash中;DST_Buffer地址为0x20000030,即RAM中;


答1:

不能改变其值得变量(包括全局和局部)都是存储在FLASH中的,能改变的都储存在SRAM中

SRC_Const_Buffer 的定义:uc32 SRC_Const_Buffert

搜索了一下uc32的出处----

typedef const uint32_tuc32; /*!< Read Only */


DST_Buffer 的定义:u32DST_Buffer[BufferSize];

搜索了一下u32的出处----

Typedef uint32_t u32;


关键字:STM32  DMA  SRAM  flash  数据传输 引用地址:STM32 DMA 应用之(一)SRAM 与flash 间数据传输

上一篇:STM32 usb_init.c和usb_int.c文件分析
下一篇:ARM启动代码中的断言伪指令ASSERT

推荐阅读最新更新时间:2024-03-16 15:26

STM32之SystemInit()函数的探讨
以前只知道systemInit是用来初始化时钟的,但是不知道怎么初始化,于是重新整理一下,详情参考 【转载】STM32学习笔记——SystemInit()函数 这篇博客写的很详细,我就不多做赘述了 ST公司推荐8M外部晶振,看时钟树可以明白,OSC32_IN和OSC32_OUT可以不用接外部晶振,用内部RC就好,以前纠结过这个问题,不知道干吗用的
[单片机]
<font color='red'>STM32</font>之SystemInit()函数的探讨
2019年NAND Flash洗牌淘汰赛一触即发
从2017年供不应求的荣景,NAND Flash市况在2018年进入风云变色的调整期,生产业者持续扩大64层3D TLC NAND供货,新一代制程技术及更大容量规格正伺机而出,供过于求与终端市场买气不足,导致2018年NAND Flash跌价幅度超过6成。 到2018年底,每GB价格已下探至0.08美元,逐渐逼近部分厂商的成本价,在跌价、扩产等多重因素影响下,2019年市况风云诡谲,供应链洗牌淘汰赛一触即发,也为全球产业的竞合局势更加增添烟消四起的氛围。 NAND位元产出连年成长 终端市场乱象横生 DRAM与NAND Flash存储器市场在过去几年几经产业跌宕,在供过于求压力下,2015~2016年市价下滑,
[手机便携]
2019年NAND <font color='red'>Flash</font>洗牌淘汰赛一触即发
基于STM32的六自由度机械臂控制与PID仿真
为实现六自由度机械臂的控制抓取并在此基础上提高抓取精确度,本文采用D-H法建立基于xArm1S智能总线机械臂的数学模型。并在Matlab2020a的RoboticsToolbox工具箱中编程实现给定机械臂末端始末位置条件下机械臂各连杆的运动仿真和角速度解算。最后以STM32单片机为核心控制模块,实现六自由度机械臂的各连杆运动控制,并在Simulink中搭建模块加入PID控制器对机械臂运动进行仿真。 六自由度机械臂具有效率高、灵活性强等优点,并可取代人类进行各类精密操作,有很强的实用价值和意义。本文选取图1中的xArm1S机械臂进行研究,为了提高精度,在使用前将机械臂固定在桌面。xArm1S机械臂在机械结构上包括六自由度机械臂
[单片机]
STM32之GPIO结构
1、STM32的GPIO结构图 GPIO共有8中设置模式:输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、推挽式复用功能,开漏复用功能,共4种输入,2种输入,2种复用功能。 2、模式说明 ①浮空输入 图中施密特触发器是开启的,IO口的状态可以直接送到输入寄存器中,CPU可以直接读取输入寄存器; 在上图中,阴影的部分处于不工作状态,尤其是下半部分的输出电路,实际上是与端口处于隔离状态。 黄色的高亮部分显示了数据传输通道,外部的电平信号通过左边编号1的IO端口进入STM32,经过编号2的施密特触发器的整形送入编号3的输入数据寄存器,在输入数据寄存器的另一端编号4,CPU可以随时读出IO端口的电平状态。 ②上拉输入
[单片机]
MSP430 flash写入(三)
/* --COPYRIGHT--,BSD_EX * Copyright (c) 2012, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above c
[单片机]
STM32中断过程详解
对于 STM32 讲(还是以Timer2例),外部中断通道位置 28(35 号优先级)是给外部设备 TIME2 的,但 TIME2本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢) 、输入捕获、输出匹配、DMA 申请等。所有TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的、不同的、中断申请呢? 1.因为cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单独的和总的控制该中断通道。它们包括有: 中断优先级控制字:PRI_n(前面有提到过) 中断允许设置位:在 ISER 寄存器中 中断允许
[单片机]
STM32开发笔记11: 在Keil中使用C++进行程序设计
单片机型号:STM32F030R8 希望在Keil中使用C++进行程序设计,开始时,总是报错,经过仔细分析,原因时Keil在默认情况下不支持C++进行程序设计。本文将介绍在Keil中使用C++进行程序设计的方法。 1、在Keil中使用C++进行程序设计,首先需要系统支持,如下图所示。 2、建立类,需要2个文件,cpp和hpp,在hpp中对类进行描述,在cpp中完成函数实现。 依循上述方法就可以使用C++进行程序设计了。
[单片机]
<font color='red'>STM32</font>开发笔记11: 在Keil中使用C++进行程序设计
采用C51与插拔式FLASH闪存设计无纸记录仪
  ATMEL公司推出的带有看门狗功能的单片机AT89C55WD带有20K的程序存储器,是8051系列中一款较为先进的产品,其看门狗功能可以大大提高产品的稳定性,大容量的内部程序存储器可以容纳功能丰富的软件。   以往的许多无纸记录仪均采用3.5英寸软盘作为数据存贮介质,但软盘存贮的可靠性差、存储容量有限、成本较高等诸多缺点实在难以克服。   作为一种高科技的非易失性存储设备,FLASH闪存首先在数码相机、PDA、移动电话等数字产品当中得到了应用,随着工艺的进步和价格的下降,逐步向其他应用领域扩展,其容量大、功耗低、速度快、不易受损等优点正受到人们越来越多的青睐,而且最大的好处是,随着技术水平的进步,FLASH闪存的容量也在不断
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved