本帖最后由 袁小远 于 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]
还请大家多多指教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>