新手求助DMA

2019-08-17 07:25发布

本帖最后由 wqq1104180120 于 2017-5-25 21:44 编辑

目前正在考虑用f103外接AD模块,AD的吞吐率12M/s左右,可以用DMA+GPIO的方式读取数据?数据量不是很大,2K就可以了,求大神解答一下。首先我想测一下DMA的速度最大能达到多少,用GPIO->IDR来做源地址,但是一直获取不到数据很疑惑,我的测试程序如下。

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "dma.h"
#include "stm32f10x.h"
#include "delay.h"
u8 Buffer[2048]={0};
u8 Buffer1[4]={1,2,3,4};
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)//配置DMA1_CHx,第一个参数是开启的DMA通道,第二个参数是外设基地址,但三个参数是存储器基地址,第四个参数是要传输的数据量
{
        
        DMA_InitTypeDef DMA_InitStruct;
        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA时钟

        DMA_DeInit(DMA_CHx);
        
        DMA_InitStruct.DMA_BufferSize=cndtr;
        DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralSRC;
        DMA_InitStruct.DMA_M2M=DMA_M2M_Disable;
        DMA_InitStruct.DMA_MemoryBaseAddr=cmar;
        DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Word;
        DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
        DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;//我们这是一次传输不循环
        DMA_InitStruct.DMA_PeripheralBaseAddr=cpar;
        DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;
        DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
        DMA_InitStruct.DMA_Priority=DMA_Priority_Medium;//由于只开启了一个通道,所以优先级随便
        DMA_Init(DMA_CHx, &DMA_InitStruct);
        

  DMA_Cmd(DMA_CHx,ENABLE);
}

void GPIOA_Config()
{
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA口
        
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
}


int main(void)
{
        u32 i=0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
        uart_init(9600);         //串口初始化为9600
        LED_Init();
        delay_init();
        GPIOA_Config();
        MYDMA_Config(DMA1_Channel4,(u32)&GPIOA->IDR,(u32)Buffer,2048);
        while(1)
        {
                LED0=!LED0;
                delay_ms(200);
                if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)
                {
                        LED1=!LED1;
                        delay_ms(200);
                        for(i=0;i<2048;i++)
            printf("%d",Buffer);
                }
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。