stm32f407之DMA(操作寄存器)

发布者:小星星龙猫最新更新时间:2018-09-20 来源: eefocus关键字:stm32f407  DMA  操作寄存器 手机看文章 扫描二维码
随时随地手机看文章

八、DMA

       直接内存访问(DMA)是用来以提供外设和内存、内存和内存之间的高速数据传输的。数据可以在没有任何CPU干预下通过的DMA进行传输。这使得CPU资源更倾重与其他操作。

       DMA控制器基于一个复杂的总线矩阵架构,结合了功能强大的双AHB主总线架构与独立的FIFO,以优化系统带宽。

        两个DMA控制器共有16个数据流(stream),每个数据流可以编程与规定的通道中的一个搭配。

 


DMA的工作模式

1.  单次传输

2. 多次传输(burst):把数据分成多次传输

 

 

DMA的工作模式

 

1. 循环模式:循环模式是可用来处理循环缓冲区和连续的数据流(如ADC扫描模式)。启此功能可以设置DMA_SxCR寄存器的CIRC位启用。

 

在循环模式,在burst方式下,它必须遵循下面的规则

DMA_SxNDTR 等于 ((Mburst beat) × (Msize)/(Psize))的整数倍。

 

2.     双缓冲模式:双缓冲模式通过设置在DMA_SxCR寄存器的DBM位启用。

双缓冲模式与单缓冲模式的区别在于它有两个地址,当栓缓冲模式被使能,循环模式会被自动使能,每次传输完成,内存地址将会被交换。当一个内存区域被DMA控制器使用时,另一个可供程序使用。

 

如果需要改变内存地址,需要遵循以下规则:

当DMA_SxCR 寄存器的CT 位为 0时,DMA_SxM1AR寄存器可以被改变

当DMA_SxCR 寄存器的CT 位为 1时,DMA_SxM0AR寄存器可以被改变

 

 


    设置步骤:

1.     使能相关时钟。

2.     如果数据流已启用,通过重置在DMA_SxCR寄存器的EN位禁用它,然后读取该位,以确认有没有持续的数据流操作。向该位写0不会立即生效,因为它实际上是在全部转移完成时才被清除的。当EN位读为0,这意味着数据流是准备好,可以进行配置了。因此,任何数据流配置之前,有必要等待EN位被清除。在数据流重新启动前,前一次DMA传输中的状态寄存器(DMA_LISR and DMA_HISR)所有数据流专用的位应该被清除。

3.      在DMA_SxPAR寄存器中设置外设端口寄存器的地址。

4.     在DMA_SxMA0R寄存器中设置内存的地址(在双缓冲模式的情况下,还需在DMA_SxMA1R寄存器中设置内存的地址)。

5.     在DMA_SxNDTR寄存器中设置传输的数据总数,每个外设的事件或每次burst传输之后,这个值是将会递减。

6.      在DMA_SxCR寄存器使用CHSEL[2:0] 选择DMA通道。

7.      如果外设为流量控制器,它支持此功能,设置DMA_SxCR寄存器中PFCTRL的位。

8.      在DMA_SxCR寄存器的PL[1:0]位配置数据流优先级。

9.     配置FIFO(启用或禁用,发送和接收的阀值)。

10.  在DMA_SxCR寄存器中配置数据传输的方向,外设和内存递增/固定的模式,单个或burst传输,外设和存储器的数据宽度,循环模式,双缓冲模式和完成几分之几后中断。

11.   激活设置数据流在DMA_SxCR寄存器的EN位。

12.  使能相关外设寄存器的DMA模式位,启动传输。

 

 

程序:

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

    标题:操作DMA的练习  

    软件平台:IAR for ARM6.21  

    硬件平台:stm32f4-discovery  

    主频:168M  

      

    描述:从其他设备接收数据,再把数据发送出去  

          USART3接收中断,发射用DMA  

    author:小船  

    data:2012-02-03  

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

  

#include   

  

u8 USART_DMA_Completed;  

u8 Rx_Completed;  

u8 Rx_data_counter;  

u8 usart3_buffer[100];  

  

void USART3_DMA_config(void);  

void USART3_config(void);  

  

void main ()  

{   

    

  SCB->AIRCR = 0x05FA0000 | 0x400;  //中断优先级分组 抢占:响应=3:1  

    

  RCC->AHB1ENR |= ( (1<<3) | (1<<21) ); //使能GPIOD时钟,使能DMA1时钟  

  RCC->APB1ENR |= (1<<18);  //使能usart3时钟  

    

  USART3_DMA_config();  

  USART3_config();  

    

  USART_DMA_Completed = 1;  

    

  while(1)  

  {    

    if(USART_DMA_Completed & Rx_Completed)  //之前数据已经发送完成,接收到新的数据  

    {    

      DMA1_Stream3->CR &= 0xFFFFFFFE; //除能DMA1_Stream3  

      while(DMA1_Stream3->CR & 0x00000001);//确保DMA可以被设置       

      DMA1->LIFCR |= 0x0f800000;//传送前清空DMA1_Stream3所有中断标志        

      DMA1_Stream3->NDTR = Rx_data_counter; //设置dma传输数据的数量  

      if((USART3->SR & (1<<7))) //发送数据寄存器空  

      {  

        USART3->CR3 &= ~(1<<7);//除能usartdma发送  

        USART_DMA_Completed = 0;  

        DMA1_Stream3->NDTR = Rx_data_counter; //设置dma传输数据的数量  

        DMA1_Stream3->CR |= 1;//使能dma  

        USART3->CR3 |= (1<<7);//使能usartdma发送  

        Rx_Completed = 0;  

        Rx_data_counter = 0;  

      }  

    }  

  }  

}  

  

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

  函数名:USART3_DMA_config  

  参数:无  

  返回值:无  

  功能:DMA1数据流3与usart3关联的相关配置  

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

void USART3_DMA_config(void)  

{  

  DMA1_Stream3->CR &= 0xFFFFFFFE; //除能DMA1_Stream3  

  while(DMA1_Stream3->CR & 0x00000001);//确保DMA可以被设置  

    

  DMA1->LIFCR |= 0x0f800000;//传送前清空DMA1_Stream3所有中断标志  

    

  DMA1_Stream3->PAR = (uint32_t)&USART3->DR;//设置外设地址USART3->DR地址0x40004804  

  DMA1_Stream3->M0AR = (uint32_t)usart3_buffer; //设置内存地址  

  DMA1_Stream3->NDTR = Rx_data_counter; //设置dma传输数据的数量  

  //DMA1_Stream3->FCR |= 0x00000007;//设置fifo  

  /*  

    设置dma通道4,即usart3tx  

    优先级Medium  

    传输方向内存到外设  

    内存递增模式  

    传输完成中断使能  

  */  

  DMA1_Stream3->CR |= ( 0x08000000 |0x00010000 | (1<<6)  

                        | (1<<10) | (1<<4) );   

  

  USART3->CR3 &= ~(1<<7);//usart3 dma发送模式除能  

    

  NVIC->IP[14] = 0xA0;  

  NVIC->ISER[0] |= (1<<14);  

    

}  

  

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

  函数名:USART3_config  

  参数:无  

  返回值:无  

  功能:配置usart3  

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

void USART3_config(void)  

{  

  USART3->BRR = 0x0000016C;   //波特率115200  

  /*  

   使能usart3  

  usart3发送使能  

  usart3接收使能  

  接收缓冲区非空中断使能  

  8bit  

  一位停止位  

  无校验  

  */  

  USART3->CR1 |= (( 1<<13 ) | ( 1<<3 ) | ( 1<<2 ) | ( 1<<5 ));   

    

  GPIOD->AFR[1] |= 0x00000077;//选择PD8,9复用功能   

    

  GPIOD->MODER &= 0xFFF0FFFF; //设置PD8,9,复用模式  

  GPIOD->MODER |= 0x000A0000;   

    

//  GPIOD->OTYPER &= 0xFFFFDFFF; //设置PD9推挽输出  

    

  GPIOD->OSPEEDR &= 0xFFFCFFFF; //PD8速度50m  

  GPIOD->OSPEEDR |= 0x00020000;  

    

  GPIOD->PUPDR &= 0xFFFCFFFF; //PD8  

  GPIOD->PUPDR |= 0x00010000;  

    

  NVIC->IP[39] = 0xf0; //最低抢占优先级,最低响应优先级1111  

  NVIC->ISER[1] |= (1<<(39-32)); //使能中断线39,也就是usart3中断  

}  

  

  

void USART3_IRQHandler(void)  

{  

  if(USART3->SR & (1<<5)) //接收数据寄存器非空  

  {  

    usart3_buffer[Rx_data_counter] = USART3->DR;  

    Rx_data_counter++;  

    if(usart3_buffer[Rx_data_counter - 1] == '\r')  

    {  

      USART3->CR1 &= ~(1<<5); //除能接收中断  

      Rx_Completed = 1;  

    }  

   }   

}  

  

void DMA1_Stream3_IRQHandler(void)  

{  

  if(DMA1->LISR & 0x08000000)//DMA传输完成  

  {  

    USART_DMA_Completed = 1;  

    USART3->CR1 |= 1<<5;  //使能usart3接收中断  

    DMA1->LIFCR |= 0x08000000;//清除中断标志  

  }  

}  

运行结果:


关键字:stm32f407  DMA  操作寄存器 引用地址:stm32f407之DMA(操作寄存器)

上一篇:stm32f407之MyDebugger(操作寄存器)
下一篇:stm32f407之EXTI(操作寄存器)

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

STM32F407-串口通信基本原理
1.处理器与外部设备通信的两种方式: 并行通信 -传输原理:数据各个位同时传输。 -优点:速度快 -缺点:占用引脚资源多 串行通信 -传输原理:数据按位顺序传输。 -优点:占用引脚资源少 -缺点:速度相对较慢 2.串行通信 按照数据传送方向,分为: 单工: 数据传输只支持数据在一个方向上传输 半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信; 全双工: 允许数据同时在两个方向上传输,因此,全双工通信是两个 单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 3.串行通信的通
[单片机]
STM32F407-串口通信基本原理
STM32中485采用串口DMA发送,切换收发状态问题
RS485使用DMA发送,切换收发状态,有以下几种实现方式: 开启DMA的“发送完成中断”,在DMA的发送完成中断中,切换收发的状态。但是,这会导致最后的2个字节发送不出去,这是因为:DMA的“发送完成中断”出现在刚发送倒数第二个字节的起始位置,这个时候切换485的收发,若接收端不是奇校验的话 将会误收到0xFF 最后第一肯定也出不去。 网上提供的解决办法是:①在DMA的TC中断里面 加大于两个字节的延时 这是OK的。 ②在DMA的TC中断里面 开启USART的“发送完成中断” 去USART的中断里面去处理 这是OK的。 看数据手册,可以利用串口的“发送完成中断TC”实现。开启USART的DMA,开启DMA传输通道,开启USA
[单片机]
STM32中485采用串口<font color='red'>DMA</font>发送,切换收发状态问题
stm32f407时钟系统
IWDG:内部32kHz RTC:内部32kHz、外部32.768kHz、HSE8Mhz分频 PLL配置:M=8,N=336,P=2,Q=7. SYSCLK选用PLL倍频的P,PLLCLK输出168Mhz AHB PRESC不分频输出168Mhz APB1 4分频为42Mhz APB1定时器84Mhz APB2 2分频为84Mhz APB2定时器168Mhz
[单片机]
<font color='red'>stm32f407</font>时钟系统
stm32f030超时定时器+Dma的配置
经常我们会用到空闲中断IDLE,但是空闲中断默认一个BIT接收不到就是超时,而在超时中断中,超时时间是可以自己设定的, 超时时间根据波特率以及超时规定的字节个数来确定。此处的超时时间是 40 * (1/19200). #define USART_ReceiverTimeOut 40 void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; /* DMA1 Channe3 (triggered by UART1 Rx event) Config */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1
[单片机]
stm32f407之外部中断使用流程
1.初始化 1.初始化相关结构体 NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; 2.打开SYSCFG SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); 3.配置EXTI EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrup
[单片机]
STM32F407中断初始化代码
void Interrupt_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; //1.IO初始化 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_M
[单片机]
stm32F407+ov7670的摄像头识别
单片机源程序如下: #include system.h #include SysTick.h #include led.h #include usart.h #include tftlcd.h #include malloc.h #include sdio_sdcard.h #include flash.h #include ff.h #include fatfs_app.h #include key.h #include font_show.h #include exti.h #include time.h #include string.h #include math.h
[单片机]
stm32F407+ov7670的摄像头识别
视频采集中DMA控制的流横式接口设计
引 言    随着计算机技术、多媒体技术以及通信技术的发展,数字视频技术得到了越来越广泛的应用。在数字视频技术的研究中,视频数据传输是一个技术关键。本文针对视频数据流数据量大、实时性要求高的特点,采用流模式传输,将视频采集数据通过DMA从存储资源紧张的片内缓存区搬运至片外sDRAM帧缓冲区,实现图像的高速传输。 利用SoPC(System FPGA上,实现视频图像的采集、存储、传输和显示。采用自定制组件的办法,将多口sDRAM控制器封装成符合流模式规范的一个外设挂在Avalon总线上,非常方便DMAC进行数据的搬运,并大大提高了系统的性能。 1 流模式传输规范    流模式传输是Altera 计数器的基金项目:深圳
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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