OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3301|回复: 2

dma接收问题,总是接收上一次的数据,不能接收实时数据

[复制链接]

6

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-3-30
在线时间
33 小时
发表于 2018-3-7 16:00:32 | 显示全部楼层 |阅读模式
20金钱
void uart_init(u32 bound)
        {
    //GPIO¶Ë¿úéèÖÃ
    GPIO_InitTypeDef GPIO_InitStructure;
          USART_InitTypeDef USART_InitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;
          DMA_InitTypeDef DMA_InitStructure;
       
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        //ê1ÄüUSART1£¬GPIOAê±Öó
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //ê1ÄüDMA′«êä
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3|RCC_APB1Periph_USART2,ENABLE);//ê1ÄüUSART2ê±Öó
               
          USART_DeInit(USART3);  //¸′λ′®¿ú1
         //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
    GPIO_Init(GPIOB, &GPIO_InitStructure); //3õê¼»ˉPA9

    //USART1_RX          PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
    GPIO_Init(GPIOB, &GPIO_InitStructure);  //3õê¼»ˉPA10

   //Usart1 NVIC ÅäÖÃ
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//ÇàÕ¼óÅÏè¼¶3
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //×óóÅÏè¼¶3
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
          NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷

   //USART 3õê¼»ˉéèÖÃ
                USART_InitStructure.USART_BaudRate = bound;//ò»°ãéèÖÃÎa9600;
                USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
                USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
                USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæÅ¼D£Ñéλ
                USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
                USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //êÕ·¢Ä£ê½

    USART_Init(USART3, &USART_InitStructure); //3õê¼»ˉ′®¿ú
   /// USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//¿aÆô¿ÕÏDÖD¶Ï
                //USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE);   //ê1Äü′®¿ú1 DMA½óêÕ
   // USART_Cmd(USART3, ENABLE);                    //ê1Äü′®¿ú

    //Ïàó|μÄDMAÅäÖÃ
                DMA_DeInit(DMA1_Channel3);   //½«DMAμÄí¨μà5¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ  ′®¿ú1¶Ôó|μÄêÇDMAí¨μà5
                DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR;  //DMAíaéèADC»ùμØÖ·
                DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DMA_Rece_Buf;  //DMAÄú′æ»ùμØÖ·
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //êy¾Y′«êä·½Ïò£¬′óíaéè¶áè¡·¢Ëíμ½Äú′æ
                DMA_InitStructure.DMA_BufferSize = DMA_Rec_Len;  //DMAí¨μàμÄDMA»o′æμÄ′óD¡
                DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //íaéèμØÖ·¼Ä′æÆ÷2»±ä
                DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //Äú′æμØÖ·¼Ä′æÆ÷μYÔö
                DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //êy¾Y¿í¶èÎa8λ
                DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //êy¾Y¿í¶èÎa8λ
                DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //1¤×÷ÔúÕy3£»o′æÄ£ê½
                DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //DMAí¨μà xóμóDÖDóÅÏè¼¶
                DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMAí¨μàxûóDéèÖÃÎaÄú′æμ½Äú′æ′«êä
                DMA_Init(DMA1_Channel3, &DMA_InitStructure);  //¸ù¾YDMA_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉDMAμÄí¨μàUSART1_Tx_DMA_ChannelËù±êê¶μļÄ′æÆ÷
                               
                USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//¿aÆô¿ÕÏDÖD¶Ï
                USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE);   //ê1Äü′®¿ú1 DMA½óêÕ
    USART_Cmd(USART3, ENABLE);
    DMA_Cmd(DMA1_Channel3, ENABLE);  //Õyê½Çy¶ˉDMA′«êä

}

//ÖØD»ָ′DMAÖ¸Õë
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
        DMA_Cmd(DMA_CHx, DISABLE );  //1رÕUSART1 TX DMA1 ËùÖ¸ê¾μÄí¨μà      
        DMA_SetCurrDataCounter(DMA_CHx,DMA_Rec_Len);//DMAí¨μàμÄDMA»o′æμÄ′óD¡
        DMA_Cmd(DMA_CHx, ENABLE);  //ê1ÄüUSART1 TX DMA1 ËùÖ¸ê¾μÄí¨μà
}       

//·¢Ëílen¸ö×Ö½ú.
//buf:·¢ËíÇøê×μØÖ·
//len:·¢ËíμÄ×Ö½úêy
void Usart3_Send(u8 *buf,u8 len)
{
        u8 t;
          for(t=0;t<len;t++)                //&#209;-&#187;··¢&#203;íêy&#190;Y
        {                  
                while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);          
                USART_SendData(USART3,buf[t]);
        }         
        while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);               
}

//′&#174;&#191;ú&#214;D&#182;&#207;oˉêy
void USART3_IRQHandler(void)                        //′&#174;&#191;ú1&#214;D&#182;&#207;·t&#206;&#241;3ìDò
        {
#ifdef OS_TICKS_PER_SEC                 //è&#231;1&#251;ê±&#214;ó&#189;ú&#197;&#196;êy&#182;¨ò&#229;á&#203;,&#203;μ&#195;÷òaê1ó&#195;ucosIIá&#203;.
        OSIntEnter();   
#endif
               
        if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)  //&#189;óê&#213;&#214;D&#182;&#207;(&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y±&#216;D&#235;ê&#199;0x0d 0x0a&#189;á&#206;2)
                {
                        MYDMA_Enable(DMA1_Channel3);
                  USART_ReceiveData(USART3);//&#182;áè&#161;êy&#190;Y ×¢òa£o&#213;a&#190;&#228;±&#216;D&#235;òa£&#172;·&#241;&#212;ò2&#187;&#196;ü1&#187;&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;&#161;£&#206;òò22&#187;&#214;aμà&#206;aé&#182;£&#161;
                  //Usart1_Rec_Cnt = DMA_Rec_Len-DMA_GetCurrDataCounter(DMA1_Channel3);        //&#203;&#227;3&#246;&#189;ó±&#190;&#214;&#161;êy&#190;Y3¤&#182;è
                        //if(DMA_Rece_Buf[5]==0x01)
                        //{
                        //        GPIO_SetBits(GPIOD,GPIO_Pin_0);
                                //delay_ms(1000);
                        //        GPIO_ResetBits(GPIOD,GPIO_Pin_0);
                        //}
                        //memset(DMA_Rece_Buf,0,200);
                        //***********&#214;&#161;êy&#190;Y′|àíoˉêy************//
                        //printf ("The lenght:%d\r\n",Usart1_Rec_Cnt);
                        //printf ("The data:\r\n");
                        //Usart1_Send(DMA_Rece_Buf,Usart1_Rec_Cnt);
                        //printf ("\r\nOver! \r\n");
                        //*************************************//
                        USART_ClearITPendingBit(USART3, USART_IT_IDLE);         //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;
                //        MYDMA_Enable(DMA1_Channel3);                   //&#187;&#214;&#184;′DMA&#214;&#184;&#213;&#235;£&#172;μè′y&#207;&#194;ò&#187;′&#206;μ&#196;&#189;óê&#213;
                //        DMA_Cmd(DMA1_Channel3, ENABLE);
     }
               
#ifdef OS_TICKS_PER_SEC                 //è&#231;1&#251;ê±&#214;ó&#189;ú&#197;&#196;êy&#182;¨ò&#229;á&#203;,&#203;μ&#195;÷òaê1ó&#195;ucosIIá&#203;.
        OSIntExit();                                                                                           
#endif
}
求大神帮忙看下,谢谢

最佳答案

查看完整内容[请看2#楼]

在DMA中断中清楚传输完成标志,这样DMA才知道你已经传输完了,然后才可以传输新的数据
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-3-7 16:00:33 | 显示全部楼层
在DMA中断中清楚传输完成标志,这样DMA才知道你已经传输完了,然后才可以传输新的数据
没有脑袋
回复

使用道具 举报

6

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-3-30
在线时间
33 小时
 楼主| 发表于 2018-3-20 11:01:07 | 显示全部楼层
美丽的时光机器 发表于 2018-3-7 20:25
在DMA中断中清楚传输完成标志,这样DMA才知道你已经传输完了,然后才可以传输新的数据

调试好了,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 02:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表