DMA(STM32)

1.DMA:data memory access //实际的内存存储

注:DMA干活的时候是不需要CPU干涉的

2.

①内存(定义的变量)---外设(寄存器);

②内存---内存

③外设---外设(一个外设的寄存器到另一个外设的寄存器)

3.

STM32有两个DMA控制器

如图:

4.举例说明:(内存到外设,串口1 TX DMA)

 1 void USART1_DMA_Config(void)
 2 {
 3         DMA_InitTypeDef DMA_InitStructure;
 4
 5         /*Open the DMA clock*/
 6         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
 7
 8         /*Set the DMA source: serial port data register address*/
 9         DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
10
11         /*Memory address,(A pointer to the variable transmission)*/
12         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
13
14         /*Direction:From memory to the peripherals*/
15         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
16
17         /*Transmission size:DMA_BufferSize=SENDBUFF_SIZE*/
18         DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
19
20         /*It does not increase peripheral address*/
21         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
22
23         /*Memory address since the increase*/
24         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
25
26         /*A peripheral unit of data*/
27         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
28
29         /*Memory data unit:8bit*/
30         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
31
32         /*The DMA mode: cycle*/
33         //DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
34         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
35
36         /*priority:medium*/
37         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
38
39         /*Memory to memory transmission is prohibited*/
40         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
41
42         /*Configuration of the channel 4*/
43         DMA_Init(DMA1_Channel4, &DMA_InitStructure);
44
45         /*enable DMA1_Channel4*/
46         DMA_Cmd (DMA1_Channel4,ENABLE);
47         //DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);  //Configuration after completion of the DMA interrupt
48 }

①USART1_TX挂载在DMA1的通道4(每个DMA有7个通道,对应不同外设)如图:

②程序第九行source(源)

即:源头地址(外设地址)

1 #define USART1_DR_Base 0x40013804 // 0x40013800 + 0x04 = 0x40013804

怎么算出来的呢?

请来看:

基地址是什么呢?

故:串口1的数据寄存器地址:

// 0x40013800 + 0x04 = 0x40013804

③内存地址,自己定义的数组

④方向:内存到外设

⑤传输大小:5000个字节

⑥外设地址不增,内存地址自增,把5000个字节循环发完

⑦发送模式:有Normal:送完5000个字节工作就结束了,circular则是循环发送

⑧优先级:假如在一个程序里面有几个外设同时申请了DMA请求,则根据优先级不同来选择配置那个

⑨禁止内存到内存的传输

4.看看main函数

            uint16_t i;

            /*Filling is going to send data*/
            for(i=0;i<SENDBUFF_SIZE;i++)
            {
                SendBuff[i]     = ‘A‘;
            }

        /* USART1向DMA发出TX请求*/
        USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

        /* 此时CPU是空闲的,可以来做别的事情*/

        //LED  At the same time scintillation
        for(;;)
        {
            LED1(ON);
            Delay(0xFFFFF);
            LED1(OFF);
            Delay(0xFFFFF);
        }

注:这样串口1不断向外发送数据,不影响CPU运行,CPU可以藤下时间做别的事情;(同事干两件事情)
 

M3里面的DMA只能软件触发,有的芯片可以外部的脉冲触发;

时间: 2024-10-27 11:32:15

DMA(STM32)的相关文章

CAN通信(STM32)

1.CAN是控制器局域网络(Controller Area Network, CAN)的简称 (理论知识不做讲解了,太多了) 2.芯片选用:TJA1050 差分信号输入, 这里的显性电平CANH和CANL压差是2V左右,逻辑上表示“0” 两线之间没有压差CANH和CANL都是2.5V左右,表示逻辑“1” (二)实现代码 1. /* 配置CAN模块*/ CAN_Config(); void CAN_Config(void){①CAN_GPIO_Config();   //此处用PB8/PB9 CA

FSMC(STM32)

 (一)FSMC:Flexible Static Memory Controller,可变(灵活)静态存储控制器 小容量产品是指闪存存储器容量在1 6K至32K字节之间的STM32F101xx.STM32F102xx和 STM32F103xx微控制器. 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx.STM32F102xx和 STM32F103xx微控制器. 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103x

2019年9月19日星期四(STM32)

一.RTC(实时时钟) 1.背景 时间在计算机系统中是一个非常重要的参数,在很多应用场景下都需要使用时间.RTC就是一个专门记录时间的设备,本质上是一个1Hz定时器. 为了计时准确,计时系统掉电也要能够正常计时.为了到达这个目的,RTC需要独立的时钟源,独立的供电电源 stm32f407的RTC的时钟源是低速晶振(LSE---32.768KHz),使用纽扣电池单独供电 2.stm32f407的RTC RTC进行2次预分频,一次7位异步和15位的同步,最终得到1hz的时钟,为了降低功耗,异步预分频

简单背后的不简单&mdash;&mdash;初识arduino(stm32)

每一篇博文都是本人原创,禁止转载 知道arduino是在上大学的时候,但是在很多做单片机 开发的人眼中看来,arduino是给外行人玩的,因此自诩为专业嵌入式开发的很多人(当然也包括我)对这种东西当然是不屑的.因为机缘巧合,我有了一种想要学习arduino软件构架的想法,因为最早的arduino的是基于avr单片机,我手头没有相关的硬件,因此我打算使用目前广泛使用的stm32的单片机开始对arduino的背后代码的研究. 最早开发arduino对stm32支持的是LeafsLabs公司( htt

NIOS2随笔——DMA(1)

1. NIOS2 DMA控制器结构框图 与其它IP外设一样,DMA控制器也是通过AVALON MM总线,实现寄存器配置,数据读写功能. 2. NIOS2 DMA三种传输方式 3. NIOS2 DMA API函数 NIOS2 DMA的API函数原型都定义在alt_dma.h头文件中,常用的API函数如下: alt_dma_txchan alt_dma_txchan_open (const char* name); static ALT_INLINE int alt_dma_txchan_send 

stm32 DMA数据搬运 [操作寄存器+库函数](转)

源:stm32 DMA数据搬运 [操作寄存器+库函数] DMA(Direct Memory Access)常译为“存储器直接存取”.早在Intel的8086平台上就有了DMA应用了. 一个完整的微控制器通常由CPU.存储器和外设等组件构成.这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由CPU完成.如此一来,CPU作为整个芯片的核心,其处理的工作量是很大的.如果CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据...这样的数据搬运工作将使CPU的负荷显

STM32 F407VG (二)DMA

根据ST公司提供的相关信息,DMA是STM32中一个独立与Cortex-M4核的模块:主要功能是通信"桥梁"的作用,可以将所有外设寄存器和内存空间"连接"起来,这样就可以高速问各寄存器,其传输不受CPU的支配,其间的通讯不占CPU资源,访问速度高,传输还是双向的(双AHB主总线结构):它可以将外设寄存器中的数据与储存器中变量建立绑定,还可以将一外设的寄存器或缓冲器与另外设的寄存器或缓冲器建立双向通讯. 1.DMA初始化 DMA_Init(DMAx_Streamy,

STM32之输入捕获以及小小应用(库)

五一之际,先祝大家五一快乐.其实快乐很简单,工作的人有假放,学习的人也有假放,像我,有假放才有更多的时间学自己想学的东西.51假期学51,可惜没有32假期呀.好了..言归正传,大家听过吸星大法吧..在这里.智商和情商比我高的人估计又知道我要说什么了..没错了..今天我们来了解"葵花宝典"第STM32篇之输入捕获,也就是上文所讲的"吸星大法", 那输入捕获可以用来干嘛呢??这个问题问的好,输入捕获可以用来测量脉冲宽度或者测量频率,假如要捕获一个脉冲的高电平脉宽,我们要

一步步学习操作系统(2)——在STM32上实现一个可动态加载kernel的&quot;my-boot&quot;

如果要做嵌入式Linux,我们首先要在板子上烧写的往往不是kernel,而是u-boot,这时需要烧写工具帮忙.当u-boot烧写成功后,我们就可以用u-boot附带的网络功能来烧写kernel了.每当板子上电时,u-boot一般会被加载到内存的前半段,如果我们的kernel之前就已经被烧写到开发板了,那么u-boot会加载kernel到内存的后半段并跳转到kernel的起始地址处执行(或者直接跳转到kernel的起始地址处执行,如果kernel可以直接在flash上执行的话.) 如上图所示,绿