OpenEdv-开源电子网

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

F407板子 DMA接收串口数据问题

[复制链接]

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-8-24
在线时间
15 小时
发表于 2016-9-5 23:46:54 | 显示全部楼层 |阅读模式
我的板子是探索者F407,前几天看到使用串口1配合DMA接收不定长数据,大大减轻CPU载荷这篇帖子,觉得不错,想拿来做实验,结果出问题了,代码反复看了,总是找不出问题,拜托各位大神帮帮忙,我菜鸟一只!!!使用串口1配合DMA接收不定长数据,大大减轻CPU载荷。此贴的描述说明。

最近经常看见坛友在论坛上问串口接收的问题,我之前刚好由于项目需要用到PLC的PPI协议,需要不停地利用串口接收数据,一开始的时候采用单字节中断的方式接收判断。但是用来做通信的时候需要不停的产生串口接收中断,会严重影响主程序的运行。后来采用DMA接收的方式,但是一般情况下配置的DMA都是接定长的串口数据,对于未知长度的串口数据接收并不适用。后来在网上发现了一种方法可以利用串口的空闲中断+DMA接收的方法完美解决此类问题,特别适用于不需要每个就收字节都判断的串口数据接收,下面说一下事实现思路和程序。

实现思路:采用STM32F103的串口1,并配置成空闲中断模式且使能DMA接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成之后,当外部给单片机发送数据的时候,假设这帧数据长度是100个字节,那么在单片机接收到一个字节的时候并不会产生串口中断,而是DMA在后台把数据默默地搬运到你指定的缓冲区里面。当整帧数据发送完毕之后串口才会产生一次中断,此时可以利用DMA_GetCurrDataCounter();函数计算出本次的数据接受长度,从而进行数据处理。


帖子上使用的是103芯片,我是用F407芯片的,不知道是不是两个芯片的DMA模块上使用有区别,我都是照帖子的程序照搬过来的。


MYDMA_Enable(DMA2_Stream5,SEND_BUF_SIZE);                   //恢复DMA指针,等待下一次接受

//开启一次DMA传输
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{

        DMA_Cmd(DMA_Streamx, DISABLE);                     
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}       
               
        DMA_SetCurrDataCounter(DMA_Streamx,ndtr);         

        DMA_Cmd(DMA_Streamx, ENABLE);                     
}

觉得可能是上面这几段代码有问题,感觉DMA指针没有恢复的样子







第一次能接受到数据,后面就都接受不到数据了

第一次能接受到数据,后面就都接受不到数据了

DMA 串口接收数据.zip

4.74 MB, 下载次数: 617

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7884

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-9-6 12:49:04 | 显示全部楼层
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-8-24
在线时间
15 小时
 楼主| 发表于 2016-9-6 22:21:53 | 显示全部楼层
八度空间 发表于 2016-9-6 12:49
你串口空闲中断里边怎么处理的?贴出来看下

我发现单片机只能接收到一次数据 是因为少了DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5);//清除传输完成中断标志位但是添加上之后又出现了其他问题!!

MAIN函数
[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "dma.h"

//ALIENTEK ì½Ë÷ÕßSTM32F407¿a·¢°å êμÑé23
//DMA êμÑé-¿aoˉêy°æ±¾  
//¼¼êõÖ§3Ö£owww.openedv.com
//ìÔ±|μêÆì£ohttp://eboard.taobao.com  
//1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾  
//×÷ÕߣoÕyμãÔ-×ó @ALIENTEK

#define SEND_BUF_SIZE 100
extern u8 SendBuff[SEND_BUF_SIZE];       

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏ輶·Ö×é2
        delay_init(168);     //3õê¼»ˉÑóê±oˉêy
        uart_init(115200);        //3õê¼»ˉ′®¿ú2¨ìØÂêÎa115200
        MYDMA_Config(DMA2_Stream5,DMA_Channel_4,(u32)&USART1->DR,(u32)SendBuff,SEND_BUF_SIZE);//DMA2,STEAM7,CH4,íaéèÎa′®¿ú1,′æ′¢Æ÷ÎaSendBuff,3¤¶èÎa:SEND_BUF_SIZE.          
        MYDMA_Enable(DMA2_Stream5,SEND_BUF_SIZE);        //¿aÆôò»′ÎDMA′«êä
       
        while(1);
}




[/mw_shl_code]

串口
[mw_shl_code=c,true]#include "sys.h"
#include "usart.h"       
#include "dma.h"
//////////////////////////////////////////////////////////////////////////////////          
//èç1ûê1óÃucos,Ôò°üà¨ÏÂÃæμÄí·Îļt¼′¿é.
#if SYSTEM_SUPPORT_OS
#include "includes.h"                                        //ucos ê1óà         
#endif


//////////////////////////////////////////////////////////////////////////////////         
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//ALIENTEK STM32F4ì½Ë÷Õß¿a·¢°å
//′®¿ú13õê¼»ˉ                  
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//DT¸ÄèÕÆú:2014/6/10
//°æ±¾£oV1.5
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) 1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾ 2009-2019
//All rights reserved
//********************************************************************************
//V1.3DT¸ÄËμÃ÷
//Ö§3Öêêó|2»í¬ÆμÂêÏÂμÄ′®¿ú2¨ìØÂêéèÖÃ.
//¼óèëá˶ÔprintfμÄÖ§3Ö
//Ôö¼óáË′®¿ú½óêÕÃüáî1|Äü.
//DTÕyáËprintfμúò»¸ö×Ö·û¶aê§μÄbug
//V1.4DT¸ÄËμÃ÷
//1,DT¸Ä′®¿ú3õê¼»ˉIOμÄbug
//2,DT¸ÄáËUSART_RX_STA,ê1μÃ′®¿ú×î′ó½óêÕ×Ö½úêyÎa2μÄ14′η½
//3,Ôö¼óáËUSART_REC_LEN,óÃóú¶¨òå′®¿ú×î′óÔêDí½óêÕμÄ×Ö½úêy(2»′óóú2μÄ14′η½)
//4,DT¸ÄáËEN_USART1_RXμÄê1Äü·½ê½
//V1.5DT¸ÄËμÃ÷
//1,Ôö¼óá˶ÔUCOSIIμÄÖ§3Ö
//////////////////////////////////////////////////////////////////////////////////           


#define SEND_BUF_SIZE 100        //·¢Ëíêy¾Y3¤¶è,×îoÃμèóúsizeof(TEXT_TO_SEND)+2μÄÕûêy±¶.

u8 SendBuff[SEND_BUF_SIZE];        //·¢Ëíêy¾Y»o3åÇø

//////////////////////////////////////////////////////////////////
//¼óèëòÔÏÂ′úÂë,Ö§3Öprintfoˉêy,¶ø2»DèòaÑ¡Ôñuse MicroLIB          
#if 1
#pragma import(__use_no_semihosting)            
//±ê×¼¿aDèòaμÄÖ§3Öoˉêy                 
struct __FILE
{
        int handle;
};

FILE __stdout;      
//¶¨òå_sys_exit()òÔ±üÃaê1óðëÖ÷»úģ꽠  
_sys_exit(int x)
{
        x = x;
}
//Öض¨òåfputcoˉêy
int fputc(int ch, FILE *f)
{        
        while((USART1->SR&0X40)==0);//Ñ-»··¢Ëí,Ö±μ½·¢Ëííê±Ï   
        USART1->DR = (u8) ch;      
        return ch;
}
#endif

#if EN_USART1_RX   //èç1ûê1Äüá˽óêÕ       

void Usart1_Send(u8 *buf,u8 len)
{
        u8 t;
          for(t=0;t<len;t++)                //&#209;-&#187;··¢&#203;íêy&#190;Y
        {                  
                while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);          
                USART_SendData(USART1,buf[t]);
        }         
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);               
}

//3&#245;ê&#188;&#187;ˉIO ′&#174;&#191;ú1
//bound:2¨ì&#216;&#194;ê
void uart_init(u32 bound){
   //GPIO&#182;&#203;&#191;úéè&#214;&#195;
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //ê1&#196;üGPIOAê±&#214;ó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//ê1&#196;üUSART1ê±&#214;ó

        //′&#174;&#191;ú1&#182;&#212;ó|òy&#189;&#197;&#184;′ó&#195;ó3é&#228;
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9&#184;′ó&#195;&#206;aUSART1
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10&#184;′ó&#195;&#206;aUSART1
       
        //USART1&#182;&#203;&#191;ú&#197;&#228;&#214;&#195;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9ó&#235;GPIOA10
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//&#184;′ó&#195;1|&#196;ü
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //&#203;ù&#182;è50MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //í&#198;íì&#184;′ó&#195;ê&#228;3&#246;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //é&#207;à-
        GPIO_Init(GPIOA,&GPIO_InitStructure); //3&#245;ê&#188;&#187;ˉPA9£&#172A10

   //USART1 3&#245;ê&#188;&#187;ˉéè&#214;&#195;
        USART_InitStructure.USART_BaudRate = bound;//2¨ì&#216;&#194;êéè&#214;&#195;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×&#214;3¤&#206;a8&#206;&#187;êy&#190;Y&#184;&#241;ê&#189;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò&#187;&#184;&#246;í£&#214;1&#206;&#187;
        USART_InitStructure.USART_Parity = USART_Parity_No;//&#206;T&#198;&#230;&#197;&#188;D£&#209;é&#206;&#187;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//&#206;Tó2&#188;têy&#190;Yá÷&#191;&#216;&#214;&#198;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //ê&#213;·¢&#196;£ê&#189;
  USART_Init(USART1, &USART_InitStructure); //3&#245;ê&#188;&#187;ˉ′&#174;&#191;ú1
       
        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);   //ê1&#196;ü′&#174;&#191;ú1 DMA&#189;óê&#213;
  USART_Cmd(USART1, ENABLE);  //ê1&#196;ü′&#174;&#191;ú1
       
        //USART_ClearFlag(USART1, USART_FLAG_TC);
       
#if EN_USART1_RX       
        USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//&#191;a&#198;&#244;&#207;à1&#216;&#214;D&#182;&#207;

        //Usart1 NVIC &#197;&#228;&#214;&#195;
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//′&#174;&#191;ú1&#214;D&#182;&#207;í¨μà
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //×óó&#197;&#207;è&#188;&#182;3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1&#196;ü
        NVIC_Init(&NVIC_InitStructure);        //&#184;ù&#190;Y&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉVIC&#188;&#196;′&#230;&#198;÷&#161;¢

#endif
       
}


void USART1_IRQHandler(void)                        //′&#174;&#191;ú1&#214;D&#182;&#207;·t&#206;&#241;3ìDò
{
        u8 Usart1_Rec_Cnt;
#if SYSTEM_SUPPORT_OS                 //è&#231;1&#251;SYSTEM_SUPPORT_OS&#206;a&#213;&#230;£&#172;&#212;òDèòa&#214;§3&#214;OS.
        OSIntEnter();   
#endif
       
        if(USART_GetITStatus(USART1, 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)
                {
                       
                  USART_ReceiveData(USART1);//&#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 = SEND_BUF_SIZE-DMA_GetCurrDataCounter(DMA2_Stream5);        //&#203;&#227;3&#246;&#189;ó±&#190;&#214;&#161;êy&#190;Y3¤&#182;è
                  
                        //***********&#214;&#161;êy&#190;Y′|àíoˉêy************//
                        printf ("The lenght:%d\r\n",Usart1_Rec_Cnt);
                        printf ("The data:\r\n");
                        Usart1_Send(SendBuff,Usart1_Rec_Cnt);
                        printf ("\r\nOver! \r\n");
                        //*************************************//
                        USART_ClearITPendingBit(USART1, USART_IT_IDLE);         //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;
                       
                        DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5);//&#199;&#229;3yDMA2_Steam7′&#171;ê&#228;íê3é±ê&#214;&#190;                       
               
//                        while(1)
//                        {
//                                if(DMA_GetFlagStatus(DMA2_Stream5,DMA_FLAG_TCIF5)!=RESET)//μè′yDMA2_Steam7′&#171;ê&#228;íê3é
//                                {
//                                        DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5);//&#199;&#229;3yDMA2_Steam7′&#171;ê&#228;íê3é±ê&#214;&#190;
//                                        break;
//                                }
//                        }

                        MYDMA_Enable(DMA2_Stream5,SEND_BUF_SIZE);                        //&#187;&#214;&#184;′DMA&#214;&#184;&#213;&#235;£&#172;μè′y&#207;&#194;ò&#187;′&#206;μ&#196;&#189;óê&#213;
     }
               
#if SYSTEM_SUPPORT_OS         //è&#231;1&#251;SYSTEM_SUPPORT_OS&#206;a&#213;&#230;£&#172;&#212;òDèòa&#214;§3&#214;OS.
        OSIntExit();                                                                                           
#endif
}
#endif       




[/mw_shl_code]

DMA
[mw_shl_code=c,true]#include "dma.h"                                                                                                                                                     
#include "delay.h"                 
//////////////////////////////////////////////////////////////////////////////////         
//±&#190;3ìDò&#214;&#187;1&#169;&#209;§&#207;°ê1ó&#195;£&#172;&#206;′&#190;-×÷&#213;&#223;Dí&#191;é£&#172;2&#187;μ&#195;ó&#195;óú&#198;&#228;&#203;üè&#206;o&#206;ó&#195;í&#190;
//ALIENTEK STM32F407&#191;a·¢°&#229;
//DMA &#199;y&#182;ˉ′ú&#194;&#235;          
//&#213;yμ&#227;&#212;-×ó@ALIENTEK
//&#188;&#188;ê&#245;&#194;&#219;ì3:www.openedv.com
//′′&#189;¨è&#213;&#198;ú:2014/5/6
//°&#230;±&#190;£oV1.0
//°&#230;è¨&#203;ùóD£&#172;μá°&#230;±&#216;&#190;&#191;&#161;£
//Copyright(C) 1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190; 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////          


//DMAxμ&#196;&#184;÷í¨μà&#197;&#228;&#214;&#195;
//&#213;aà&#239;μ&#196;′&#171;ê&#228;D&#206;ê&#189;ê&#199;1ì&#182;¨μ&#196;,&#213;aμ&#227;òa&#184;ù&#190;Y2&#187;í&#172;μ&#196;&#199;é&#191;&#246;à′DT&#184;&#196;
//′ó′&#230;′¢&#198;÷->íaéè&#196;£ê&#189;/8&#206;&#187;êy&#190;Y&#191;í&#182;è/′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
//DMA_StreamxMAêy&#190;Yá÷,DMA1_Stream0~7/DMA2_Stream0~7
//chxMAí¨μà&#209;&#161;&#212;&#241;,@ref DMA_channel DMA_Channel_0~DMA_Channel_7
//par:íaéèμ&#216;&#214;·
//mar:′&#230;′¢&#198;÷μ&#216;&#214;·
//ndtr:êy&#190;Y′&#171;ê&#228;á&#191;  
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{

        DMA_InitTypeDef  DMA_InitStructure;
       
        if((u32)DMA_Streamx>(u32)DMA2)//μ&#195;μ&#189;μ±&#199;°streamê&#199;ê&#244;óúDMA2&#187;1ê&#199;DMA1
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ê±&#214;óê1&#196;ü
               
        }else
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ê±&#214;óê1&#196;ü
        }
  DMA_DeInit(DMA_Streamx);
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//μè′yDMA&#191;é&#197;&#228;&#214;&#195;
       
  /* &#197;&#228;&#214;&#195; DMA Stream */
  DMA_InitStructure.DMA_Channel = chx;  //í¨μà&#209;&#161;&#212;&#241;
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMAíaéèμ&#216;&#214;·
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ′&#230;′¢&#198;÷0μ&#216;&#214;·
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//íaéèμ&#189;′&#230;′¢&#198;÷&#196;£ê&#189;
  DMA_InitStructure.DMA_BufferSize = ndtr;//êy&#190;Y′&#171;ê&#228;á&#191;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéè·&#199;&#212;&#246;á&#191;&#196;£ê&#189;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//íaéèêy&#190;Y3¤&#182;è:8&#206;&#187;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//′&#230;′¢&#198;÷êy&#190;Y3¤&#182;è:8&#206;&#187;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ê1ó&#195;&#209;-&#187;·&#196;£ê&#189;£&#172;2&#187;&#191;é2éó&#195;&#198;&#213;í¨&#196;£ê&#189;£&#172;2&#187;&#214;a&#206;ao&#206;
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//&#214;Dμèó&#197;&#207;è&#188;&#182;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//′&#230;′¢&#198;÷í&#187;·¢μ¥′&#206;′&#171;ê&#228;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//íaéèí&#187;·¢μ¥′&#206;′&#171;ê&#228;
  DMA_Init(DMA_Streamx, &DMA_InitStructure);//3&#245;ê&#188;&#187;ˉDMA Stream
       
}
//&#191;a&#198;&#244;ò&#187;′&#206;DMA′&#171;ê&#228;
//DMA_StreamxMAêy&#190;Yá÷,DMA1_Stream0~7/DMA2_Stream0~7
//ndtr:êy&#190;Y′&#171;ê&#228;á&#191;  
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{

        DMA_Cmd(DMA_Streamx, DISABLE);                      //1&#216;±&#213;DMA′&#171;ê&#228;
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}        //è·±£DMA&#191;éò&#212;±&#187;éè&#214;&#195;  
               
        DMA_SetCurrDataCounter(DMA_Streamx,ndtr);          //êy&#190;Y′&#171;ê&#228;á&#191;  

        DMA_Cmd(DMA_Streamx, ENABLE);                      //&#191;a&#198;&#244;DMA′&#171;ê&#228;
}          


























[/mw_shl_code]

串口助手运行结果:


怎么会运行出这结果,郁闷!!!!
捕获_副本.png
回复 支持 反对

使用道具 举报

120

主题

7884

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-9-7 08:54:27 | 显示全部楼层
奔跑的蟑螂 发表于 2016-9-6 22:21
我发现单片机只能接收到一次数据 是因为少了DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5);//清除传输完成 ...

不要在中断服务函数中使用printf(个人建议),操作步骤大体相当
我的发送函数
void HAL_Submcu_uart_dma_Transmit(uint16_t Size)
{
        DMA1_Channel2->CNDTR = (uint16_t)Size;
        DMA_Cmd(DMA1_Channel2, ENABLE);  //开始传输
}

中断服务函数
void USART3_IRQHandler(void)
{
#if MB_SUB_USER_DMA_EN
        if (USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)  //产生了空闲中断
        {
                if ((usart_dma_dev.MB_SUB_USART_Flag & MB_SUB_USART_Flag_TC) != 0)
                {
                        DMA_Cmd(DMA1_Channel3, DISABLE);  //先关闭,预防干扰
                        usart_dma_dev.MB_SUB_USART_RX_Index = usart_dma_dev.MB_SUB_USART_RX_Length - DMA_GetCurrDataCounter(DMA1_Channel3);  //获取当前接收到的数据长度
                        DMA1_Channel3->CNDTR = (uint16_t)usart_dma_dev.MB_SUB_USART_RX_Length;  //重新配置接收长度
                        DMA_Cmd(DMA1_Channel3, ENABLE);
                        (void)USART_ReceiveData(USART3);
                        usart_dma_dev.MB_SUB_USART_Flag |= MB_SUB_USART_Flag_RXE;
//                        printf("usart dma rcv ok %d\r\n", usart_dma_dev.MB_SUB_USART_RX_Index);
                }
        }
        /* ==================== STM32F30x Series chips ==================== */
        #if __STM32xx == 0x03  //STM32F30x
        USART_ClearITPendingBit(USART3, USART_IT_IDLE);
        #endif
#else
        uint8_t res=0;            
       
        if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收到数据
        {
                res = USART_ReceiveData(USART3);  //读取接收到的数据
                if (HAL_UART_RXCount < HAL_UART_RXD_Num)
                {
                        HAL_UART_RXBuf[HAL_UART_RXCount] = res;  //记录接收到的值
                        HAL_UART_RXCount++;                  //接收数据增加1
                }
        }
#endif
}
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-8-24
在线时间
15 小时
 楼主| 发表于 2016-9-7 23:28:54 | 显示全部楼层
我把程序DMA初始化时的模式改成了循环模式DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;程序就正常了!!!真的郁闷了,虽然问题是解决了,但我还是不知道为什么。觉得问题是调用MYDMA_Enable(DMA2_Stream5,SEND_BUF_SIZE);这个函数的时候,DMA指针没有复位的原因。但如果是这样,那么为什么会没有复位。
MYDMA_Enable()函数的实现:
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{      
       DMA_Cmd(DMA_Streamx, DISABLE);                      //1&#216;±&#213;DMA′&#171;ê&#228;
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}        //è·±£DMA&#191;éò&#212;±&#187;éè&#214;&#195;         
        DMA_SetCurrDataCounter(DMA_Streamx,ndtr);          //êy&#190;Y′&#171;ê&#228;á&#191;  
        DMA_Cmd(DMA_Streamx, ENABLE);                      //&#191;a&#198;&#244;DMA′&#171;ê&#228;
}          



问题1:如果是DMA指针没有复位的问题,那么是为什么没有复位呢?
问题2:DMA的初始化的循环模式与普通模式到底有什么具体的区别。

[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "dma.h"

//ALIENTEK ì&#189;&#203;÷&#213;&#223;STM32F407&#191;a·¢°&#229; êμ&#209;é23
//DMA êμ&#209;é-&#191;aoˉêy°&#230;±&#190;  
//&#188;&#188;ê&#245;&#214;§3&#214;£owww.openedv.com
//ì&#212;±|μê&#198;ì£ohttp://eboard.taobao.com  
//1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190;  
//×÷&#213;&#223;£o&#213;yμ&#227;&#212;-×ó @ALIENTEK

#define SEND_BUF_SIZE 200
extern u8 SendBuff[SEND_BUF_SIZE];       

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éè&#214;&#195;&#207;μí3&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é2
        delay_init(168);     //3&#245;ê&#188;&#187;ˉ&#209;óê±oˉêy
        uart_init(115200);        //3&#245;ê&#188;&#187;ˉ′&#174;&#191;ú2¨ì&#216;&#194;ê&#206;a115200
        MYDMA_Config(DMA2_Stream5,DMA_Channel_4,(u32)&USART1->DR,(u32)SendBuff,SEND_BUF_SIZE);//DMA2,STEAM7,CH4,íaéè&#206;a′&#174;&#191;ú1,′&#230;′¢&#198;÷&#206;aSendBuff,3¤&#182;è&#206;a:SEND_BUF_SIZE.          
        MYDMA_Enable(DMA2_Stream5,SEND_BUF_SIZE);        //&#191;a&#198;&#244;ò&#187;′&#206;DMA′&#171;ê&#228;
       
        while(1);
}

[/mw_shl_code]

[mw_shl_code=c,true]#include "dma.h"                                                                                                                                                     
#include "delay.h"                 
//////////////////////////////////////////////////////////////////////////////////         
//±&#190;3ìDò&#214;&#187;1&#169;&#209;§&#207;°ê1ó&#195;£&#172;&#206;′&#190;-×÷&#213;&#223;Dí&#191;é£&#172;2&#187;μ&#195;ó&#195;óú&#198;&#228;&#203;üè&#206;o&#206;ó&#195;í&#190;
//ALIENTEK STM32F407&#191;a·¢°&#229;
//DMA &#199;y&#182;ˉ′ú&#194;&#235;          
//&#213;yμ&#227;&#212;-×ó@ALIENTEK
//&#188;&#188;ê&#245;&#194;&#219;ì3:www.openedv.com
//′′&#189;¨è&#213;&#198;ú:2014/5/6
//°&#230;±&#190;£oV1.0
//°&#230;è¨&#203;ùóD£&#172;μá°&#230;±&#216;&#190;&#191;&#161;£
//Copyright(C) 1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190; 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////          


//DMAxμ&#196;&#184;÷í¨μà&#197;&#228;&#214;&#195;
//&#213;aà&#239;μ&#196;′&#171;ê&#228;D&#206;ê&#189;ê&#199;1ì&#182;¨μ&#196;,&#213;aμ&#227;òa&#184;ù&#190;Y2&#187;í&#172;μ&#196;&#199;é&#191;&#246;à′DT&#184;&#196;
//′ó′&#230;′¢&#198;÷->íaéè&#196;£ê&#189;/8&#206;&#187;êy&#190;Y&#191;í&#182;è/′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
//DMA_StreamxMAêy&#190;Yá÷,DMA1_Stream0~7/DMA2_Stream0~7
//chxMAí¨μà&#209;&#161;&#212;&#241;,@ref DMA_channel DMA_Channel_0~DMA_Channel_7
//par:íaéèμ&#216;&#214;·
//mar:′&#230;′¢&#198;÷μ&#216;&#214;·
//ndtr:êy&#190;Y′&#171;ê&#228;á&#191;  
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{

        DMA_InitTypeDef  DMA_InitStructure;
       
        if((u32)DMA_Streamx>(u32)DMA2)//μ&#195;μ&#189;μ±&#199;°streamê&#199;ê&#244;óúDMA2&#187;1ê&#199;DMA1
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ê±&#214;óê1&#196;ü
               
        }else
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ê±&#214;óê1&#196;ü
        }
  DMA_DeInit(DMA_Streamx);
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//μè′yDMA&#191;é&#197;&#228;&#214;&#195;
       
  /* &#197;&#228;&#214;&#195; DMA Stream */
  DMA_InitStructure.DMA_Channel = chx;  //í¨μà&#209;&#161;&#212;&#241;
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMAíaéèμ&#216;&#214;·
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ′&#230;′¢&#198;÷0μ&#216;&#214;·
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//íaéèμ&#189;′&#230;′¢&#198;÷&#196;£ê&#189;
  DMA_InitStructure.DMA_BufferSize = ndtr;//êy&#190;Y′&#171;ê&#228;á&#191;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéè·&#199;&#212;&#246;á&#191;&#196;£ê&#189;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//íaéèêy&#190;Y3¤&#182;è:8&#206;&#187;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//′&#230;′¢&#198;÷êy&#190;Y3¤&#182;è:8&#206;&#187;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ê1ó&#195;&#209;-&#187;·&#196;£ê&#189;£&#172;2&#187;&#191;é2éó&#195;&#198;&#213;í¨&#196;£ê&#189;£&#172;2&#187;&#214;a&#206;ao&#206;
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//&#214;Dμèó&#197;&#207;è&#188;&#182;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//′&#230;′¢&#198;÷í&#187;·¢μ¥′&#206;′&#171;ê&#228;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//íaéèí&#187;·¢μ¥′&#206;′&#171;ê&#228;
  DMA_Init(DMA_Streamx, &DMA_InitStructure);//3&#245;ê&#188;&#187;ˉDMA Stream
       
}
//&#191;a&#198;&#244;ò&#187;′&#206;DMA′&#171;ê&#228;
//DMA_StreamxMAêy&#190;Yá÷,DMA1_Stream0~7/DMA2_Stream0~7
//ndtr:êy&#190;Y′&#171;ê&#228;á&#191;  
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{

        DMA_Cmd(DMA_Streamx, DISABLE);                      //1&#216;±&#213;DMA′&#171;ê&#228;
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}        //è·±£DMA&#191;éò&#212;±&#187;éè&#214;&#195;  
               
        DMA_SetCurrDataCounter(DMA_Streamx,ndtr);          //êy&#190;Y′&#171;ê&#228;á&#191;  

        DMA_Cmd(DMA_Streamx, ENABLE);                      //&#191;a&#198;&#244;DMA′&#171;ê&#228;
}       

[mw_shl_code=c,true]#include "sys.h"
#include "usart.h"       
#include "dma.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////          
//è&#231;1&#251;ê1ó&#195;ucos,&#212;ò°üà¨&#207;&#194;&#195;&#230;μ&#196;í·&#206;&#196;&#188;t&#188;′&#191;é.
#if SYSTEM_SUPPORT_OS
#include "includes.h"                                        //ucos ê1ó&#195;          
#endif


//////////////////////////////////////////////////////////////////////////////////         
//±&#190;3ìDò&#214;&#187;1&#169;&#209;§&#207;°ê1ó&#195;£&#172;&#206;′&#190;-×÷&#213;&#223;Dí&#191;é£&#172;2&#187;μ&#195;ó&#195;óú&#198;&#228;&#203;üè&#206;o&#206;ó&#195;í&#190;
//ALIENTEK STM32F4ì&#189;&#203;÷&#213;&#223;&#191;a·¢°&#229;
//′&#174;&#191;ú13&#245;ê&#188;&#187;ˉ                  
//&#213;yμ&#227;&#212;-×ó@ALIENTEK
//&#188;&#188;ê&#245;&#194;&#219;ì3:www.openedv.com
//DT&#184;&#196;è&#213;&#198;ú:2014/6/10
//°&#230;±&#190;£oV1.5
//°&#230;è¨&#203;ùóD£&#172;μá°&#230;±&#216;&#190;&#191;&#161;£
//Copyright(C) 1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190; 2009-2019
//All rights reserved
//********************************************************************************
//V1.3DT&#184;&#196;&#203;μ&#195;÷
//&#214;§3&#214;êêó|2&#187;í&#172;&#198;μ&#194;ê&#207;&#194;μ&#196;′&#174;&#191;ú2¨ì&#216;&#194;êéè&#214;&#195;.
//&#188;óè&#235;á&#203;&#182;&#212;printfμ&#196;&#214;§3&#214;
//&#212;&#246;&#188;óá&#203;′&#174;&#191;ú&#189;óê&#213;&#195;üá&#238;1|&#196;ü.
//DT&#213;yá&#203;printfμúò&#187;&#184;&#246;×&#214;·&#251;&#182;aê§μ&#196;bug
//V1.4DT&#184;&#196;&#203;μ&#195;÷
//1,DT&#184;&#196;′&#174;&#191;ú3&#245;ê&#188;&#187;ˉIOμ&#196;bug
//2,DT&#184;&#196;á&#203;USART_RX_STA,ê1μ&#195;′&#174;&#191;ú×&#238;′ó&#189;óê&#213;×&#214;&#189;úêy&#206;a2μ&#196;14′&#206;·&#189;
//3,&#212;&#246;&#188;óá&#203;USART_REC_LEN,ó&#195;óú&#182;¨ò&#229;′&#174;&#191;ú×&#238;′ó&#212;êDí&#189;óê&#213;μ&#196;×&#214;&#189;úêy(2&#187;′óóú2μ&#196;14′&#206;·&#189;)
//4,DT&#184;&#196;á&#203;EN_USART1_RXμ&#196;ê1&#196;ü·&#189;ê&#189;
//V1.5DT&#184;&#196;&#203;μ&#195;÷
//1,&#212;&#246;&#188;óá&#203;&#182;&#212;UCOSIIμ&#196;&#214;§3&#214;
//////////////////////////////////////////////////////////////////////////////////           


#define SEND_BUF_SIZE 200        //·¢&#203;íêy&#190;Y3¤&#182;è,×&#238;o&#195;μèóúsizeof(TEXT_TO_SEND)+2μ&#196;&#213;&#251;êy±&#182;.

u8 SendBuff[SEND_BUF_SIZE];        //·¢&#203;íêy&#190;Y&#187;o3&#229;&#199;&#248;

//////////////////////////////////////////////////////////////////
//&#188;óè&#235;ò&#212;&#207;&#194;′ú&#194;&#235;,&#214;§3&#214;printfoˉêy,&#182;&#248;2&#187;Dèòa&#209;&#161;&#212;&#241;use MicroLIB          
#if 1
#pragma import(__use_no_semihosting)            
//±ê×&#188;&#191;aDèòaμ&#196;&#214;§3&#214;oˉêy                 
struct __FILE
{
        int handle;
};

FILE __stdout;      
//&#182;¨ò&#229;_sys_exit()ò&#212;±ü&#195;aê1ó&#195;°&#235;&#214;÷&#187;ú&#196;£ê&#189;   
_sys_exit(int x)
{
        x = x;
}
//&#214;&#216;&#182;¨ò&#229;fputcoˉêy
int fputc(int ch, FILE *f)
{        
        while((USART1->SR&0X40)==0);//&#209;-&#187;··¢&#203;í,&#214;±μ&#189;·¢&#203;ííê±&#207;   
        USART1->DR = (u8) ch;      
        return ch;
}
#endif

#if EN_USART1_RX   //è&#231;1&#251;ê1&#196;üá&#203;&#189;óê&#213;       

void Usart1_Send(u8 *buf,u8 len)
{
        u8 t;
          for(t=0;t<len;t++)                //&#209;-&#187;··¢&#203;íêy&#190;Y
        {                  
                while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);          
                USART_SendData(USART1,buf[t]);
        }         
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);               
}

//3&#245;ê&#188;&#187;ˉIO ′&#174;&#191;ú1
//bound:2¨ì&#216;&#194;ê
void uart_init(u32 bound){
   //GPIO&#182;&#203;&#191;úéè&#214;&#195;
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //ê1&#196;üGPIOAê±&#214;ó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//ê1&#196;üUSART1ê±&#214;ó

        //′&#174;&#191;ú1&#182;&#212;ó|òy&#189;&#197;&#184;′ó&#195;ó3é&#228;
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9&#184;′ó&#195;&#206;aUSART1
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10&#184;′ó&#195;&#206;aUSART1
       
        //USART1&#182;&#203;&#191;ú&#197;&#228;&#214;&#195;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9ó&#235;GPIOA10
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//&#184;′ó&#195;1|&#196;ü
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //&#203;ù&#182;è50MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //í&#198;íì&#184;′ó&#195;ê&#228;3&#246;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //é&#207;à-
        GPIO_Init(GPIOA,&GPIO_InitStructure); //3&#245;ê&#188;&#187;ˉPA9£&#172A10

   //USART1 3&#245;ê&#188;&#187;ˉéè&#214;&#195;
        USART_InitStructure.USART_BaudRate = bound;//2¨ì&#216;&#194;êéè&#214;&#195;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×&#214;3¤&#206;a8&#206;&#187;êy&#190;Y&#184;&#241;ê&#189;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò&#187;&#184;&#246;í£&#214;1&#206;&#187;
        USART_InitStructure.USART_Parity = USART_Parity_No;//&#206;T&#198;&#230;&#197;&#188;D£&#209;é&#206;&#187;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//&#206;Tó2&#188;têy&#190;Yá÷&#191;&#216;&#214;&#198;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //ê&#213;·¢&#196;£ê&#189;
  USART_Init(USART1, &USART_InitStructure); //3&#245;ê&#188;&#187;ˉ′&#174;&#191;ú1
       
        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);   //ê1&#196;ü′&#174;&#191;ú1 DMA&#189;óê&#213;
  USART_Cmd(USART1, ENABLE);  //ê1&#196;ü′&#174;&#191;ú1
       
        //USART_ClearFlag(USART1, USART_FLAG_TC);
       
#if EN_USART1_RX       
        USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//&#191;a&#198;&#244;&#207;à1&#216;&#214;D&#182;&#207;

        //Usart1 NVIC &#197;&#228;&#214;&#195;
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//′&#174;&#191;ú1&#214;D&#182;&#207;í¨μà
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //×óó&#197;&#207;è&#188;&#182;3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1&#196;ü
        NVIC_Init(&NVIC_InitStructure);        //&#184;ù&#190;Y&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉVIC&#188;&#196;′&#230;&#198;÷&#161;¢

#endif
       
}


void USART1_IRQHandler(void)                        //′&#174;&#191;ú1&#214;D&#182;&#207;·t&#206;&#241;3ìDò
{
        u8 Usart1_Rec_Cnt;
#if SYSTEM_SUPPORT_OS                 //è&#231;1&#251;SYSTEM_SUPPORT_OS&#206;a&#213;&#230;£&#172;&#212;òDèòa&#214;§3&#214;OS.
        OSIntEnter();   
#endif
       
        if(USART_GetITStatus(USART1, 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)
                {
                       
                  USART_ReceiveData(USART1);//&#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 = SEND_BUF_SIZE-DMA_GetCurrDataCounter(DMA2_Stream5);        //&#203;&#227;3&#246;&#189;ó±&#190;&#214;&#161;êy&#190;Y3¤&#182;è
                  
                        //***********&#214;&#161;êy&#190;Y′|àíoˉêy************//
                        printf ("The lenght:%d\r\n",Usart1_Rec_Cnt);
                        printf ("The data:\r\n");
                        Usart1_Send(SendBuff,Usart1_Rec_Cnt);
                        printf ("\r\nOver! \r\n");
                        //*************************************//
                        USART_ClearITPendingBit(USART1, USART_IT_IDLE);         //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;
                       
//                        DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5);//&#199;&#229;3yDMA2_Steam7′&#171;ê&#228;íê3é±ê&#214;&#190;                       
               
//                        while(1)
//                        {
//                                if(DMA_GetFlagStatus(DMA2_Stream5,DMA_FLAG_TCIF5)!=RESET)//μè′yDMA2_Steam7′&#171;ê&#228;íê3é
//                                {
//                                        DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5);//&#199;&#229;3yDMA2_Steam7′&#171;ê&#228;íê3é±ê&#214;&#190;
//                                        break;
//                                }
//                        }

                        MYDMA_Enable(DMA2_Stream5,SEND_BUF_SIZE);                        //&#187;&#214;&#184;′DMA&#214;&#184;&#213;&#235;£&#172;μè′y&#207;&#194;ò&#187;′&#206;μ&#196;&#189;óê&#213;
     }
               
#if SYSTEM_SUPPORT_OS         //è&#231;1&#251;SYSTEM_SUPPORT_OS&#206;a&#213;&#230;£&#172;&#212;òDèòa&#214;§3&#214;OS.
        OSIntExit();                                                                                           
#endif
}
#endif       




[/mw_shl_code]   



















[/mw_shl_code]


捕获.PNG
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-8-24
在线时间
15 小时
 楼主| 发表于 2016-9-7 23:32:36 | 显示全部楼层
把DMA初始化时的模式改为循环模式,后运行正常了得代码!!!!!

DMA 串口接收不定长数据.rar

3.73 MB, 下载次数: 247

修改成功后的代码

回复 支持 反对

使用道具 举报

1

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2016-8-15
在线时间
20 小时
发表于 2016-9-8 08:30:10 | 显示全部楼层
暂时还看不懂
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-10-8
在线时间
5 小时
发表于 2018-1-24 12:15:37 | 显示全部楼层
学习了,谢谢                                             
回复 支持 反对

使用道具 举报

156

主题

959

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2067
金钱
2067
注册时间
2014-3-7
在线时间
485 小时
发表于 2018-7-4 14:13:19 | 显示全部楼层
成功了吗
回复 支持 反对

使用道具 举报

2

主题

472

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5536
金钱
5536
注册时间
2018-6-27
在线时间
491 小时
发表于 2019-2-17 18:33:40 | 显示全部楼层
学习学习,学习学习。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-3-28 18:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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