#define SEND_BUF_SIZE 80 //·¢ËÍÊý¾Ý³¤¶È,×îºÃµÈÓÚsizeof(TEXT_TO_SEND)+2µÄÕûÊý±¶.
#define Receice_BUF_SIZE 80 //·¢ËÍÊý¾Ý³¤¶È,×îºÃµÈÓÚsizeof(TEXT_TO_SEND)+2µÄÕûÊý±¶.
u8 SendBuff[SEND_BUF_SIZE]; //·¢ËÍÊý¾Ý»º³åÇø
u8 ReceiceBuff[Receice_BUF_SIZE]; //·¢ËÍÊý¾Ý»º³åÇø
const u8 TEXT_TO_SEND[]={"ALIENTEK Explorer STM32F4 DMA ´®¿ÚʵÑé"};
/*wdh¸Ä³ÉDMA´«Êä¡£*/
/*
1¡¢µ÷ÊÔDMA2³ÌÐòÊÇ·ñÕýÈ·¡£ok
2¡¢¸Ä³ÉDMA2ÅäÖ㬴Ӵ洢Æ÷µ½ÍâÉè¡£ok
3¡¢¸Ä³ÉDMA2ÅäÖ㬴ÓÍâÉèµ½´æ´¢Æ÷¡£ok
3¡¢Ë«Ïòͬʱ´«Êä ok
×¢ÒâË«Ïò´«ÊäµÄ ʱºò£¬Òª¼ÇµÃË«ÏòÅäÖã¬ÅäÖÃÒ»¸ö·¢Ëͺ¯ÊýºÍÒ»¸ö½ÓÊÕº¯Êý£¬´«Êä·½Ïò²»Ò»Ñù¼´¿É¡£¡¢¡¢
×¢Òâ´®¿ÚµÄÊý¾ÝÁ÷ºÍͨµÀ²»Ò»Ñù£¬¶ÔÓÚ´®¿ÚÀ´Ëµ¡£Ò»¶¨Òª×¢Òâ¡£
*/
int main(void)
{
u16 i;
u8 t=0;
u8 j,mask=0;
float pro=0;//½ø¶È
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2
delay_init(168); //³õʼ»¯ÑÓʱº¯Êý
uart_init(115200); //³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200
LED_Init(); //³õʼ»¯LED
KEY_Init(); //°´¼ü³õʼ»¯
MYDMA_Config_Tx(DMA2_Stream7,DMA_Channel_4,(u32)&USART1->DR,(u32)SendBuff,SEND_BUF_SIZE);//DMA2,STEAM7,CH4,ÍâÉèΪ´®¿Ú1,´æ´¢Æ÷ΪSendBuff,³¤¶ÈΪ:SEND_BUF_SIZE.
MYDMA_Config_Rx(DMA2_Stream5,DMA_Channel_4,(u32)&USART1->DR,(u32)ReceiceBuff,Receice_BUF_SIZE);//DMA1,STEAM7,CH5,ÍâÉèΪ´®¿Ú1,´æ´¢Æ÷ΪSendBuff,³¤¶ÈΪ:SEND_BUF_SIZE.
//ÏÔʾÌáʾÐÅÏ¢
j=sizeof(TEXT_TO_SEND);
for(i=0;i<SEND_BUF_SIZE;i++)//Ìî³äASCII×Ö·û¼¯Êý¾Ý
{
if(t>=j)//¼ÓÈë»»Ðзû
{
if(mask)
{
SendBuff[i]=0x0a;
t=0;
}else
{
SendBuff[i]=0x0d;
mask++;
}
}else//¸´ÖÆTEXT_TO_SENDÓï¾ä
{
mask=0;
SendBuff[i]=TEXT_TO_SEND[t];
t++;
}
}
i=0;
while(1)
{
printf("\r\nDMA DATA:\r\n");
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //ʹÄÜ´®¿Ú1µÄDMA·¢ËÍ
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //ʹÄÜ´®¿Ú1µÄDMA½ÓÊÕ
MYDMA_Enable(DMA2_Stream7,SEND_BUF_SIZE); //¿ªÊ¼Ò»´ÎDMA´«Ê䣡
MYDMA_Enable(DMA2_Stream5,Receice_BUF_SIZE); //¿ªÊ¼Ò»´ÎDMA´«Ê䣡
while(1)
{
//µÈ´ýDMA´«ÊäÍê³É£¬´ËʱÎÒÃÇÀ´×öÁíÍâһЩÊ£¬µãµÆ
//ʵ¼ÊÓ¦ÓÃÖУ¬´«ÊäÊý¾ÝÆڼ䣬¿ÉÒÔÖ´ÐÐÁíÍâµÄÈÎÎñ
if(DMA_GetFlagStatus(DMA2_Stream5,DMA_FLAG_TCIF5)!=RESET)//µÈ´ýDMA2_Steam7´«ÊäÍê³É
{
printf("ReceiceBuff[] = %s\r\n",ReceiceBuff);
DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
break;
}
if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7)!=RESET)//µÈ´ýDMA2_Steam7´«ÊäÍê³É
{
DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);//Çå³ýDMA2_Steam7´«ÊäÍê³É±êÖ¾
//break;
}
pro=DMA_GetCurrDataCounter(DMA2_Stream7);//µÃµ½µ±Ç°»¹Ê£Óà¶àÉÙ¸öÊý¾Ý
pro=1-pro/SEND_BUF_SIZE;//µÃµ½°Ù·Ö±È
pro*=100; //À©´ó100±¶
printf("pro = %f\r\n",pro);
LED0=!LED0;
}
}
}
函数配置
//DMAxµÄ¸÷ͨµÀÅäÖÃ
//ÕâÀïµÄ´«ÊäÐÎʽÊǹ̶¨µÄ,ÕâµãÒª¸ù¾Ý²»Í¬µÄÇé¿öÀ´ÐÞ¸Ä
//´Ó´æ´¢Æ÷->ÍâÉèģʽ/8λÊý¾Ý¿í¶È/´æ´¢Æ÷ÔöÁ¿Ä£Ê½
//DMA_Streamx:DMAÊý¾ÝÁ÷,DMA1_Stream0~7/DMA2_Stream0~7
//chx:DMAͨµÀÑ¡Ôñ,@ref DMA_channel DMA_Channel_0~DMA_Channel_7
//par:ÍâÉèµØÖ·
//mar:´æ´¢Æ÷µØÖ·
//ndtr:Êý¾Ý´«ÊäÁ¿
void MYDMA_Config_Rx(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{
DMA_InitTypeDef DMA_InitStructure;
if((u32)DMA_Streamx>(u32)DMA2)//µÃµ½µ±Ç°streamÊÇÊôÓÚDMA2»¹ÊÇDMA1
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ʱÖÓʹÄÜ
}else
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ʱÖÓʹÄÜ
}
DMA_DeInit(DMA_Streamx);
while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//µÈ´ýDMA¿ÉÅäÖÃ
/* ÅäÖÃ DMA Stream */
DMA_InitStructure.DMA_Channel = chx; //ͨµÀÑ¡Ôñ
DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMAÍâÉèµØÖ·
DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ´æ´¢Æ÷0µØÖ·
//DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//´æ´¢Æ÷µ½ÍâÉèģʽ
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//ÍâÉèµ½´æ´¢Æ÷ģʽ
DMA_InitStructure.DMA_BufferSize = ndtr;//Êý¾Ý´«ÊäÁ¿
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉè·ÇÔöÁ¿Ä£Ê½
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//´æ´¢Æ÷ÔöÁ¿Ä£Ê½
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//ÍâÉèÊý¾Ý³¤¶È:8λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//´æ´¢Æ÷Êý¾Ý³¤¶È:8λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ʹÓÃÆÕͨģʽ
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//ÖеÈÓÅÏȼ¶
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;//ÍâÉèÍ»·¢µ¥´Î´«Êä
DMA_Init(DMA_Streamx, &DMA_InitStructure);//³õʼ»¯DMA Stream
}
void MYDMA_Config_Tx(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{
DMA_InitTypeDef DMA_InitStructure;
if((u32)DMA_Streamx>(u32)DMA2)//µÃµ½µ±Ç°streamÊÇÊôÓÚDMA2»¹ÊÇDMA1
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ʱÖÓʹÄÜ
}else
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ʱÖÓʹÄÜ
}
DMA_DeInit(DMA_Streamx);
while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//µÈ´ýDMA¿ÉÅäÖÃ
/* ÅäÖÃ DMA Stream */
DMA_InitStructure.DMA_Channel = chx; //ͨµÀÑ¡Ôñ
DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMAÍâÉèµØÖ·
DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ´æ´¢Æ÷0µØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//´æ´¢Æ÷µ½ÍâÉèģʽ
DMA_InitStructure.DMA_BufferSize = ndtr;//Êý¾Ý´«ÊäÁ¿
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉè·ÇÔöÁ¿Ä£Ê½
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//´æ´¢Æ÷ÔöÁ¿Ä£Ê½
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//ÍâÉèÊý¾Ý³¤¶È:8λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//´æ´¢Æ÷Êý¾Ý³¤¶È:8λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ʹÓÃÆÕͨģʽ
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//ÖеÈÓÅÏȼ¶
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;//ÍâÉèÍ»·¢µ¥´Î´«Êä
DMA_Init(DMA_Streamx, &DMA_InitStructure);//³õʼ»¯DMA Stream
}
//¿ªÆôÒ»´ÎDMA´«Êä
//DMA_Streamx:DMAÊý¾ÝÁ÷,DMA1_Stream0~7/DMA2_Stream0~7
//ndtr:Êý¾Ý´«ÊäÁ¿
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{
DMA_Cmd(DMA_Streamx, DISABLE); //¹Ø±ÕDMA´«Êä
while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){} //È·±£DMA¿ÉÒÔ±»ÉèÖÃ
DMA_SetCurrDataCounter(DMA_Streamx,ndtr); //Êý¾Ý´«ÊäÁ¿
DMA_Cmd(DMA_Streamx, ENABLE); //¿ªÆôDMA´«Êä
}
DMA双向传输 stm32F407
最新推荐文章于 2023-04-23 11:14:07 发布