五、DMA入门使用

DMA使用

直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。

1.初始化DMA

2.配置中断

3.实验结果

1.初始化DMA


void DMA_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //开启DMA时钟
    NVIC_Config();              //配置DMA

    /*设置DMA源:内存地址&串口数据寄存器地址*/
  DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;       

    /*内存地址(要传输变量的指针)*/  
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;

    /*方向:从内存到外设*/
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  

    /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/    
    DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;

    /*外设地址不增*/      
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 

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

    /*内存数据单元*/  
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

    /*外设数据单位*/
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;  

   /*DMA模式,一次传输,循环*/
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;   

    /*优先级中*/    
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  

    /*禁止内存到内存的传输    */
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

    /*配置DMA1的4通道*/         
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);       

        DMA_Cmd (DMA1_Channel4,ENABLE);                 //使能DMA
        DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);  //配置DMA发送完成后产生中断

}

2.配置中断

static void NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  /* 配置P[A|B|C|D|E]为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

中断handle

void DMA1_Channel4_IRQHandler(void)
{   
//判断是否发送完成
   if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET) 
   {  
   //LED关闭 

         LED1(ON);
         printf("DMA1_Channel4_IRQHandler");
         DMA_ClearFlag(DMA1_FLAG_TC4); 
    }   
}

main.c

#include "stm32f10x.h"
#include "led.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
#include "usart.h"
#include <stdio.h>
#include "stm32f10x_dma.h"
extern uint8_t SendBuff[SENDBUFF_SIZE];
void Delay(uint32_t nCount){
  uint32_t i;
  for(i=0;i<nCount;i++);
}

int main(){
  uint32_t i;
  LED_GPIO_Config();
  USART1_Config();
  DMA_Config();
    /*开始数据填充*/
  for(i=0;i<SENDBUFF_SIZE;i++)
  {
        SendBuff[i]  = 0xff;
  }
  //开始传输.此时没有占CPU.当数据传输完成,触发中断
  USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
  //开灯
  LED1(ON);
  while(1);
}

3.实验结果

LED亮 -> 数据传输完成 -> 触发中断 -> LED

源代码:http://download.youkuaiyun.com/detail/aa375809600/9717144

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值