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

2019-07-20 01:44发布

我的板子是探索者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指针没有恢复的样子







友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
八度空间
1楼-- · 2019-07-20 03:01
你串口空闲中断里边怎么处理的?贴出来看下
奔跑的蟑螂
2楼-- · 2019-07-20 08:41
 精彩回答 2  元偷偷看……
八度空间
3楼-- · 2019-07-20 12:54
奔跑的蟑螂 发表于 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 ", 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楼-- · 2019-07-20 18:44
我把程序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 ",Usart1_Rec_Cnt);
                        printf ("The data: ");
                        Usart1_Send(SendBuff,Usart1_Rec_Cnt);
                        printf (" Over! ");
                        //*************************************//
                        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]


奔跑的蟑螂
5楼-- · 2019-07-20 20:49
 精彩回答 2  元偷偷看……
OMG
6楼-- · 2019-07-21 02:01
暂时还看不懂

一周热门 更多>