初学stm32串口,不知道哪里出错?帮忙看一下

2019-03-23 15:47发布

//用的是串口3,目的是想从电脑发过来7字节数据,完成后再返回
//端口配置部分,
void PBioConfig(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;                   //éùÃ÷ò»¸ö½á11ìå±äá¿£¬óÃà′3õê¼»ˉGPIO
        //SystemInit();                                               //ê±Öó3õê¼»ˉ
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        /*  ÅäÖÃGPIOμÄÄ£ê½oíIO¿ú */
        GPIO_InitStructure.GPIO_Pin=BUZ;                       //Ñ¡ÔñÄãòaéèÖÃμÄIO¿ú
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;               //éèÖÃíÆíìêä3öÄ£ê½
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;               //éèÖÃ′«êäËùÂê
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//TX                             //′®¿úêä3öPB10
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;                 //¸′óÃíÆíìêä3ö
        GPIO_Init(GPIOB,&GPIO_InitStructure);                  /* 3õê¼»ˉ′®¿úêäèëIO */
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//RX                             //′®¿úêäèëPB11
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;           //Ä£Äaêäèë
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       
}

void Usart1_Config()                                          //′®¿ú1ÅäÖÃ
{
  USART_InitTypeDef  USART_InitStructure;                            //′®¿ú½á11ì嶨òå
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
        USART_InitStructure.USART_BaudRate=9600;                    //2¨ìØÂêéèÖÃÎa9600        //2¨ìØÂê
        USART_InitStructure.USART_WordLength=USART_WordLength_8b;                //êy¾Y3¤8λ
        USART_InitStructure.USART_StopBits=USART_StopBits_1;                          //1λí£Ö1λ
        USART_InitStructure.USART_Parity=USART_Parity_Even;                                  //oD§Ñé
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //ê§Äüó2¼tá÷
        USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;        //¿aÆô·¢Ëíoí½óêüÄ£ê½
        USART_Init(USART3,&USART_InitStructure);        /* 3õê¼»ˉUSART1 */
        USART_Cmd(USART3, ENABLE);                   /* ê1ÄüUSART1 */
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//ê1Äü»òÕßê§ÄüÖ¸¶¨μÄUSARTÖD¶Ï ½óêÕÖD¶Ï
        USART_ClearFlag(USART3,USART_FLAG_TC);//Çå3yUSARTxμÄ′y′|àí±ê־λ
       
}
void Nvic_Init()
{
  NVIC_InitTypeDef NVIC_InitStructure;//ÖD¶Ï½á11ì嶨òå
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);                 //′ò¿aê±Öó
        /* éèÖÃNVIC2Îêy */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);   
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;                  //′ò¿aUSART1μÄ諾ÖÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;          //ÇàÕ¼óÅÏ輶Îa0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                              //Ïìó|óÅÏ輶Îa0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //ê1Äü
        NVIC_Init(&NVIC_InitStructure);
}

//中段函数,摘抄的网上的
void USART3_IRQHandler(void)                                               //c′®¿ú3ÖD¶Ï
{
        u8 dat;
        //USART_ClearFlag(USART3,USART_FLAG_TC);
  if (USART_GetITStatus(USART3, USART_IT_ORE) == SET)  
  {  
     USART_ClearITPendingBit(USART3,USART_IT_ORE);      
     USART_ReceiveData( USART3 );  
  }
       
  if( USART_GetITStatus(USART3,USART_IT_RXNE) != RESET )
  {  
     USART_ClearITPendingBit(USART3,USART_IT_RXNE);  
     dat = USART_ReceiveData( USART3 );  
     ReceiveData[RecStrlen++]=dat;  
                 if( RecStrlen >= RECEIVEDATALEN )
                 {
                         RecStrlen=0;
                         ReceiveCompleteFlag=1;
                 }
  }
       
        if( USART_GetITStatus(USART3,USART_IT_TXE) != RESET )
        {
                 USART_ClearITPendingBit(USART3,USART_IT_TXE);
                 if( SendStrlen >0 )
       USART_SendData(USART3,SendBuffer[--SendStrlen]);
  }
}


main()
{
  SystemInit();        //ê±Öó3õê¼»ˉ
        GpioConfig();
        InitState();
        while(1)
        {
                if( ReceiveCompleteFlag )
                {
                        ReceiveCompleteFlag=0;
                        InitCom();
                }
                //BuzOut();
        }
}


void InitCom(void)
{
     u8 i;
     SendStrlen = RECEIVEDATALEN;

     for( i=0;i<7;i++ )
        SendBuffer[i] = ReceiveData[i];
   UartSend(USART3,0xfc);
}

实际操作时,只返回一个FC

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
gyp1
1楼-- · 2019-03-23 20:35
 精彩回答 2  元偷偷看……
ena
2楼-- · 2019-03-23 23:42
gyp1 发表于 2018-7-8 23:58
没具体看,不过我按你用到USART_IT_TXE了,但是没有使能

使能之后,还是不行的
LeoMe
3楼-- · 2019-03-24 04:36
GPIO你只是初始化成了输入输出,但是Alternate function 好像没有配置
如果要使用内部外设去实现硬件控制GPIO 需要配置GPIO的Alternate function才行
gyp1
4楼-- · 2019-03-24 06:41
 精彩回答 2  元偷偷看……
ienglgge
5楼-- · 2019-03-24 12:04
实际操作时,只返回一个FC, 这就是  UartSend(USART3,0xfc);的结果。你要什么结果呢
在学习的路上
6楼-- · 2019-03-24 17:58
你发送的只有一个fc啊

一周热门 更多>