新手上路
- 积分
- 21
- 金钱
- 21
- 注册时间
- 2016-4-27
- 在线时间
- 2 小时
|
发表于 2016-5-5 17:53:07
|
显示全部楼层
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ê±Öóê1Äü
DMA_DeInit(DMA1_Stream1);
while (DMA_GetCmdStatus(DMA1_Stream1) != DISABLE){}//μè′yDMA¿éÅäÖÃ
DMA_ClearITPendingBit(DMA1_Stream1,DMA_IT_FEIF1|DMA_IT_DMEIF1|DMA_IT_TEIF1|DMA_IT_HTIF1|DMA_IT_TCIF1);//Çå¿ÕDMA1_Stream1éÏËùóDÖD¶Ï±êÖ¾
/* ÅäÖÃ DMA Stream *///′®¿ú½óêÕDMAêy¾Y
DMA_InitStructure.DMA_Channel = DMA_Channel_4; //í¨μàÑ¡Ôñ
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART3->DR);//DMAíaéèμØÖ·
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)uart_dma_gbufv[0].g_uart_rvdb;//DMA ′æ′¢Æ÷0μØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//íaéèÄ£ê½μ½′æ′¢Æ÷
DMA_InitStructure.DMA_BufferSize = DMA_RX_BUF_SIZE;//êy¾Y′«êäá¿
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéè·ÇÔöá¿Ä£ê½
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//′æ′¢Æ÷Ôöá¿Ä£ê½
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//íaéèêy¾Y3¤¶è:8λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//′æ′¢Æ÷êy¾Y3¤¶è:8λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ê1óÃÆÕí¨Ä£ê½
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;//¸ßóÅÏè¼¶
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//′æ′¢Æ÷í»·¢μ¥′Î′«êä
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//íaéèí»·¢μ¥′Î′«êä
DMA_Init(DMA1_Stream1, &DMA_InitStructure);//3õê¼»ˉDMA Stream
/***********Ë«»o3å**********/
DMA_DoubleBufferModeConfig(DMA1_Stream1,(u32)uart_dma_gbufv[1].g_uart_rvdb, DMA_Memory_0);
DMA_DoubleBufferModeCmd(DMA1_Stream1,ENABLE);
DMA_ITConfig(DMA1_Stream1,DMA_IT_TC,ENABLE);
DMA_Cmd(DMA1_Stream1, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void DMA1_Stream1_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_Stream1,DMA_IT_TCIF1) != RESET)
{
DMA_ClearITPendingBit(DMA1_Stream1,DMA_IT_TCIF1);
DMA_Cmd(DMA1_Stream1, DISABLE);//1رÕDMA
if(DMA_GetCurrentMemoryTarget(DMA1_Stream1))
{
uart_dma_gbufv[1].g_uart_rvdb_len = DMA_GetCurrDataCounter(DMA1_Stream1);
printf("uart_dma_gbufv[1].g_uart_rvdb_len == %d\n",uart_dma_gbufv[1].g_uart_rvdb_len) ;
}
else
{
uart_dma_gbufv[0].g_uart_rvdb_len = DMA_GetCurrDataCounter(DMA1_Stream1);
printf("uart_dma_gbufv[0].g_uart_rvdb_len == %d\n",uart_dma_gbufv[0].g_uart_rvdb_len) ;
}
DMA_Cmd(DMA1_Stream1, ENABLE);//′ò¿aDMA
}
}
串口 + DMA 双缓存接收数据。。。 
|
|