OpenEdv-开源电子网

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

STM32F407 串口接收不到数据问题

[复制链接]

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2018-12-29
在线时间
26 小时
发表于 2022-8-23 22:11:01 | 显示全部楼层 |阅读模式
各位大神,最近在做F407串口DMA收发程序发现一个奇特的问题。串口配置如下代码,当与工控机上位机通讯时,出现不正常现象。当STM32F407板子先上电,而后开启工控机,工控机的上位机软件一打开,监控软件显示正常收发了第一条握手指令后,上位机再往下发其他配置指令,此时单片机串口无法接收数据,不断电的情况下,重新烧录一下程序,又能正常接收到上位机下发的数据,请教各位大神看下面配置代码,有什么未配置的。

void uart3_Init(u32 bound)//初始化
{
    //GPIO¶Ë¿úéèÖÃ
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    USART_DeInit(USART3);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);                         //ê1ÄüGPIOBê±Öó
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);                        //ê1ÄüUSART3ê±Öó
    //′®¿ú3¶Ôó|òy½Å¸′óÃó3éä
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);         //GPIOB10¸′óÃÎaUSART3
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);        //GPIOB11¸′óÃÎaUSART3
    //USART3¶Ë¿úÅäÖÃ
    GPIO_InitStructure.GPIO_Pin          = GPIO_Pin_10 | GPIO_Pin_11;//GPIOB10óëGPIOB11
    GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_AF;                                                        //¸′óÃ1|Äü
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                                //Ëù¶è100MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                                 //íÆíì¸′óÃêä3ö
    GPIO_InitStructure.GPIO_PuPd         = GPIO_PuPd_UP;                                                 //éÏà-
    GPIO_Init(GPIOB,&GPIO_InitStructure);                                                                                 //3õê¼»ˉPB10,PB11
    //USART3 3õê¼»ˉéèÖÃ
    USART_InitStructure.USART_BaudRate = bound;                                                                //2¨ìØÂêéèÖÃ
    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õê¼»ˉ′®¿ú3

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

    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream1_IRQn;         //½óêÕí¨μàÎaDMA1_Stream1_IRQn
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //ÇàÕ¼óÅÏè¼¶Îa 1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                                 //Ïìó|óÅÏè¼¶Îa 2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                         //í¨μàÖD¶Ïê1Äü
    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn ;                                //′®¿ú3·¢ËíÖD¶Ïí¨μà
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;                         //ÇàÕ¼óÅÏè¼¶1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 3;                   //×óóÅÏè¼¶3
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;         //IRQí¨μàê1Äü
    NVIC_Init(&NVIC_InitStructure);

    USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);          //¿aÆô′®¿ú¿ÕÏDÖD¶Ï
    USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);          // ¿aÆô′®¿úDMA½óêÕ
    USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE);          // ¿aÆô′®¿úDMA·¢Ëí
    /* ÅäÖÃ′®¿úDMA½óêÕ*/
    DMA_InitTypeDef DMA_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);  // ¿aÆôDMAê±Öó
    DMA_DeInit(DMA1_Stream1);
    DMA_InitStructure.DMA_Channel = DMA_Channel_4;                                 //í¨μàÑ¡Ôñ
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART3->DR;                //DMAíaéèμØÖ·
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)com3_rx_buffer;                //DMA ′æ′¢Æ÷0μØÖ·
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;                                           //′æ′¢Æ÷μ½íaéèÄ£ê½
    DMA_InitStructure.DMA_BufferSize = USART3_MAX_LEN;                                                                                //ê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¤¶è£o8λ
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;                        //′æ′¢Æ÷êy¾Y3¤¶è£o8λ
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                                                                                //ê1óÃÆÕí¨Ä£ê½
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                                            //¸ßμèóÅÏè¼¶
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;              //2»¿aÆôFIFOÄ£ê½
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;       //FIFOãDÖμ
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;                                  //′æ′¢Æ÷í»·¢μ¥′Î′«êä
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;                //íaéèí»·¢μ¥′Î′«êä
    DMA_Init(DMA1_Stream1, &DMA_InitStructure);
    DMA_Cmd(DMA1_Stream1, ENABLE); //ê1ÄüDMA1_Stream1í¨μà
               
                /* ÅäÖÃDMA1 Stream3,USART3·¢Ëí */
    DMA_DeInit(DMA1_Stream3);      //3õê¼»ˉDMA Stream
    while (DMA_GetCmdStatus(DMA1_Stream3) != DISABLE);//μè′yDMA¿éÅäÖÃ
    DMA_InitStructure.DMA_Channel            = DMA_Channel_4;               //í¨μàÑ¡Ôñ
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR;            //DMAíaéèμØÖ·
    DMA_InitStructure.DMA_Memory0BaseAddr    = (u32)DMA_USART3_TX_BUF;      //DMA ′æ′¢Æ÷0μØÖ·
    DMA_InitStructure.DMA_DIR                = DMA_DIR_MemoryToPeripheral;  //′æ′¢Æ÷μ½íaéèÄ£ê½
    DMA_InitStructure.DMA_BufferSize         = DMA_USART3_TX_BUF_LEN;       //ê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¤¶è£o8λ
    DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;             //ê1óÃÆÕí¨Ä£ê½
    DMA_InitStructure.DMA_Priority           = DMA_Priority_Medium;         //ÖDμèóÅÏè¼¶
    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_Stream3, &DMA_InitStructure);                             //3õê¼»ˉDMA Stream7

    DMA_ITConfig(DMA1_Stream3, DMA_IT_TC, ENABLE);                                                                                                        //DMA1′«êäíê3éÖD¶Ï
    DMA_Cmd(DMA1_Stream3, DISABLE);                                                                                                                                                                        //2»ê1Äü   
                USART_Cmd(USART3, ENABLE);                                                                                                                                                                                  //ê1Äü′®¿ú3
}


void USART3_IRQHandler(void)                                                                                                                          //串口3中断
{
                u16 len;
    if(USART_GetITStatus(USART3,USART_IT_IDLE)!=RESET)                         //¿ÕÏDÖD¶Ï′¥·¢
    {
            com3_recv_end_flag = 1;          // ½óêÕíê3é±ê־λ1

            DMA_Cmd(DMA1_Stream1, DISABLE);                                                                                     /* ÔYê±1رÕdma,êy¾YéDÎ′′|àí */
                        len=DMA_GetCurrDataCounter(DMA1_Stream1);
            com3_rx_len = USART3_MAX_LEN - len;                                                                                /* »ñ衽óêÕμ½μÄêy¾Y3¤¶è μ¥λÎa×Ö½ú*/
            DMA_ClearFlag(DMA1_Stream1,DMA_FLAG_TCIF1);                                          /* ÇåDMA±ê־λ */
            DMA_SetCurrDataCounter(DMA1_Stream1,USART3_MAX_LEN);        /* ÖØD¸3Öμ¼ÆêyÖμ,±ØDë′óóúμèóú×î′ó¿éÄü½óêÕμ½μÄêy¾YÖ¡êyÄ¿ */
                        DMA_Cmd(DMA1_Stream1, ENABLE);                                                                              /*′ò¿aDMA*/
            USART_ReceiveData(USART3);                                                                                                           //Çå3y¿ÕÏDÖD¶Ï±ê־λ(½óêÕoˉêyóDÇå±ê־λμÄ×÷óÃ)
    }

          if(USART_GetFlagStatus(USART3,USART_IT_TXE)==RESET)                        //′®¿ú·¢Ëííê3é
          {
            USART_ITConfig(USART3,USART_IT_TC,DISABLE);
                }
               
                if(USART_GetFlagStatus(USART3,USART_FLAG_ORE) == SET) // ¼ì2éORE±êÖ¾
                {
                        USART_ClearFlag(USART3,USART_FLAG_ORE);
                        USART_ReceiveData(USART3);
                }
}


void DMA1_Stream3_IRQHandler(void)                                                                                                        //串口3 DMA发送完成中断
{
        //Çå3y±êÖ¾
        if(DMA_GetFlagStatus(DMA1_Stream3,DMA_FLAG_TCIF3)!=RESET)//μè′yDMA1_Steam3′«êäíê3é
        {
                DMA_ClearFlag(DMA1_Stream3,DMA_FLAG_TCIF3);                                          //Çå3yDMA1_Steam3′«êäíê3é±êÖ¾
           DMA_Cmd(DMA1_Stream3,DISABLE);                                                                                                 //1رÕê1Äü
    USART_ITConfig(USART3,USART_IT_TC,ENABLE);                                                  //′ò¿a′®¿ú·¢Ëííê3éÖD¶Ï
        }
}



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

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3359
金钱
3359
注册时间
2011-11-10
在线时间
207 小时
发表于 2022-8-24 14:36:43 | 显示全部楼层
检查一下是不是有数据没有读取导致ORE溢出了,溢出会导致后续数据均不接受,状态类似假死。  还是改用HAL库函数吧。
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2018-12-29
在线时间
26 小时
 楼主| 发表于 2022-8-30 15:49:16 | 显示全部楼层
拆下来是开启了USART_ITConfig(USART3,USART_IT_TC,ENABLE); 发送完成,然后工控机貌似有干扰,导致这个标志位一直没有产生,卡在这等,现在是屏蔽了这个语句,工控机开机能正常通讯了。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-8 18:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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