请教IO口数据通过DMA存储至SDRAM实现的相关问题

2019-07-20 18:03发布

本帖最后由 袁小远 于 2016-12-18 15:16 编辑

本人一直在尝试,利用定时器产生一个PWM波,每次定时器溢出更新时触发DMA,把IO口读取到的数据,利用DMA存储至SDRAM。尝试好就一直不能成功,故把已写的代码贴出来,还请大家多多指教
下面的代码,我暂时没把数据存到SDRAM,先存到了内部的数组里面,也就是cmar暂时定义为了一个数组的首地址
使用了DMA的内存到内存的模式
定时器使用了TIM5,且正确产生溢出更新中断
[mw_shl_code=c,true]void MyDMA_Config(u32 cmar)
{
        DMA_InitTypeDef DMA_InitStructure;
        //GPIOC初始化,设置为输入
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//IO口使能        
        GPIO_Configuration(GPIO_Pin_0,GPIOC);
        GPIO_Configuration(GPIO_Pin_1,GPIOC);
        GPIO_Configuration(GPIO_Pin_2,GPIOC);
        GPIO_Configuration(GPIO_Pin_3,GPIOC);
        GPIO_Configuration(GPIO_Pin_4,GPIOC);
        GPIO_Configuration(GPIO_Pin_5,GPIOC);
        GPIO_Configuration(GPIO_Pin_6,GPIOC);
        GPIO_Configuration(GPIO_Pin_7,GPIOC);
        GPIO_Configuration(GPIO_Pin_8,GPIOC);
        GPIO_Configuration(GPIO_Pin_9,GPIOC);
        GPIO_Configuration(GPIO_Pin_10,GPIOC);
        GPIO_Configuration(GPIO_Pin_11,GPIOC);
        GPIO_Configuration(GPIO_Pin_12,GPIOC);
        GPIO_Configuration(GPIO_Pin_13,GPIOC);
        GPIO_Configuration(GPIO_Pin_14,GPIOC);
        GPIO_Configuration(GPIO_Pin_15,GPIOC);
        
        //DMA初始化
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
    __nop();                    //等待 DMA1 时钟稳定
        __nop();                    //经测试最少 2 个 nop
        __nop();
        DMA_DeInit(DMA1_Stream0);
        
        //当所读取的EN位为0时,才能开始配置DMA
        while (DMA_GetCmdStatus(DMA1_Stream0) != DISABLE)
        {        
        }        
        DMA_InitStructure.DMA_Channel=DMA_Channel_6;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &GPIOC->IDR;
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) cmar;
    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
    DMA_InitStructure.DMA_BufferSize = 1;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//是否开启循环
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输,一次传递一个字节ACR_BYTE0_ADDRESS
    DMA_Init( DMA1_Stream0, &DMA_InitStructure );  
        
        //TIM5开启DMA
    TIM_DMACmd(TIM5, TIM_DMA_Update, ENABLE );  
        
        /* Enable DMA Channel6 */
    DMA_Cmd( DMA1_Stream0, ENABLE );
}

void GPIO_Configuration(uint16_t GPIO_Pin_x,GPIO_TypeDef* GPIOx)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_x;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//上拉
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
        
        GPIO_Init(GPIOx,&GPIO_InitStructure);        
}[/mw_shl_code]

还请大家多多指教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。