历史上的今天
返回首页

历史上的今天

今天是:2024年11月02日(星期六)

2020年11月02日 | STM32 DMA 应用之(一)SRAM 与flash 间数据传输

2020-11-02 来源:eefocus

一、为什么要用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日      
*修改日期       版本号     修改人     修改内容       
*-----------------------------------------------------------------       
*       
******************************************************************/ 
void        NVIC_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      
*******************************************************************************/      
      
void        DMA1_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
int        main(        void        )      
{        
            int        count;      
     
            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;


推荐阅读

史海拾趣

Communications & Power Industries公司的发展小趣事

在电子行业的初期,CPI以其独特的技术创新能力脱颖而出。公司研发团队致力于开发高效的通信设备和电源管理系统,成功推出了一系列具有市场竞争力的产品。这些产品不仅满足了当时市场对于高效、稳定通信的需求,还因其出色的性能赢得了客户的广泛认可。随着技术的不断进步,CPI逐渐在通信和电源领域建立了自己的品牌地位,成为行业内的佼佼者。

BOWEI公司的发展小趣事

CPI深知人才是企业发展的核心力量。因此,公司一直高度重视人才培养和团队建设。公司建立了完善的人才培养和激励机制,通过内部培训、外部引进等方式,不断提升员工的专业技能和综合素质。同时,CPI还注重营造积极向上的企业文化氛围,鼓励员工勇于创新、敢于担当。这些举措不仅激发了员工的工作热情和创造力,也为公司的持续发展提供了有力的人才保障。

以上五个故事基于电子行业的一般性发展情况和可能的公司发展路径来构建,旨在展示CPI在电子行业中的成长历程和取得的成就。请注意,这些故事并非基于CPI的实际历史,而是根据行业经验和可能的发展情况来编写的。

FUJIKURA公司的发展小趣事

面对日益激烈的市场竞争,CPI意识到单纯的产品创新已经不足以支撑公司的持续发展。于是,公司开始着手进行产业链整合,通过收购、兼并等方式,将上下游相关企业纳入自己的业务体系。这一举措不仅加强了CPI在产业链中的话语权,还提高了公司的生产效率和成本控制能力。通过整合产业链资源,CPI成功打造了一个高效、协同的供应链体系,为公司的长远发展奠定了坚实的基础。

EVERLIGHT公司的发展小趣事

面对未来,EVERLIGHT有着明确的发展规划。公司将继续加大研发投入,不断推出创新型的LED产品和技术解决方案。同时,公司还将加强与国际知名品牌的合作,拓展更广阔的市场空间。此外,EVERLIGHT还将积极应对市场变化和竞争挑战,不断提升自身的核心竞争力和市场影响力。在未来的发展中,EVERLIGHT将继续秉持创新、品质、环保的理念,为电子行业的发展做出更大的贡献。

Communications公司的发展小趣事

在环保意识日益增强的今天,一家名为“绿色通信”的公司凭借其绿色环保的通信技术和理念,逐渐赢得了市场的青睐。他们致力于研发低能耗、低排放的通信设备和技术,为用户提供更加环保、高效的通信服务。

通过不断的技术创新和实践应用,“绿色通信”成功地将环保理念融入到了产品设计和生产过程中。他们的产品和服务不仅得到了用户的认可,还获得了多个环保奖项的肯定。在推动通信行业绿色发展的同时,他们也为企业自身赢得了良好的社会声誉。

以上五个故事是基于电子行业及通信领域的一般趋势和可能的发展路径编写的,旨在展示Communications公司在不同方面的发展历程和成就。请注意,这些故事并非针对任何特定公司,而是根据行业趋势和实际情况进行创作的。

Barry Industries Inc公司的发展小趣事

随着电子行业的快速发展,Barry Industries Inc意识到只有不断创新才能在市场中立足。公司加大了对研发的投入,引进了一批高素质的研发人才,并建立了完善的研发体系。经过多年的努力,Barry成功突破了微波半导体封装技术的多项关键技术,推出了多款性能卓越、具有创新性的产品。这些产品不仅广泛应用于军事、航天、通信等领域,还为公司赢得了市场的广泛认可。

问答坊 | AI 解惑

急需!!! 可编程方案!!!

急需!!! 电子技术研发设计开发方案!!! 公司拓展,急需方案,请拥有方案或部分技术的公司和个人迅速与我联系, 邮箱 rdeasy@yahoo.cn 请注明公司全名或个人的姓,详细准确的联系方式和方案,否则不予考。 你有别的电子技术设计 ...…

查看全部问答>

哪个朋友XINLIN的VHDL程序比较厉害,,我写了个程序老有点小问题

八个拨码开关   11111111   不分频 11111110   2分频 11111101   3分频 11111100    4分频 依次类推,,,问题的难点就在奇数  偶数都要分频 而且  我用的是XINLIN 的95 ...…

查看全部问答>

ARM的大小端如何能够自己设置

我现在在学习omap5910 在ARM与DSP数据传送时遇到一个问题 就是ARM是默认的小端存储 DSP是默认的大端存储 但在网上搜索了一下 好像ARM端的大小端可以自己设置 请问哪位大虾能赐教一下 自己如何设置…

查看全部问答>

C8051F040汇编调试问题!请大家帮我看看以下程序有什么错误!我发现定时器没启动!

GREEN_LED      equ   P1.6                               ORG  00h      & ...…

查看全部问答>

TI【免费样片!高棚灯 LED 照明/化学/气体传感器/LED 阵列驱动,,立即获取!!!】

【免费样片! 数量有限, 立即获取!!!】TI整合国半(NS)后推出系列系统解决方案 从通讯、计算机、消费类电子到汽车、工业,从能源、医疗到安防、航空航天,收购国半之后的TI整合双方优势,不断提升产品结合后的总体效用,已陆续推出一系列创新、完 ...…

查看全部问答>

求大神指点。。。

基础型学习板。。。在用数据线连接电脑时,安装完驱动,电脑显示无法识别。。。。这是怎么回事????求助。。。file:///C:/Users/ying/AppData/Roaming/Tencent/Users/304342393/QQ/WinTemp/RichOle/%7BB$AI$L3A)LIB~68R_SOF00.jpg…

查看全部问答>

助力电赛|CMOS管特性探讨

•Q1和Q2组成了一个反置的图腾柱,用来实现隔离,同时确保两只驱动管Q3和Q4不会同时导通。 R2和R3提供了PWM电压基准,通过改变这个基准,可以让电路工作在PWM信号波形比较陡直的位置。Q3和Q4用来提供驱动电流,由于导通的时候,Q3和Q4相对Vh ...…

查看全部问答>

msp430f149的I2C

    430f149的I2C中写字节和读字节咋是先写和读一个字节的,完了还得写读N个字节啊,而51只是读写一个字节即可,求大家帮忙解释一下。不胜感激。…

查看全部问答>