STM32F303发现-USART_IT_RXNE从未收到任何信息(无DMA/无HAL)

STM32F303发现-USART_IT_RXNE从未收到任何信息(无DMA/无HAL),stm32,usart,Stm32,Usart,我对C代码和STM平台都很陌生;我用它做一个学校项目。 我通过USART(特别是USART3)进行双卡通信。传感器卡(从)的任务是仅发送其当前距离测量值。我已经成功地设置了这个。 通过示波器,使用RS232/UART通信模式,我可以看到发送的hexe是“STX M 2 3 ETX” 其中,M是它是什么类型的包的代码,2和3是十六进制0x23=35(cm)。它每15毫秒发送一次新的测量值 现在来谈谈我的问题。我似乎无法配置Master的USART3来接收这些包。 这是我当前的代码: void US

我对C代码和STM平台都很陌生;我用它做一个学校项目。 我通过USART(特别是USART3)进行双卡通信。传感器卡(从)的任务是仅发送其当前距离测量值。我已经成功地设置了这个。 通过示波器,使用RS232/UART通信模式,我可以看到发送的hexe是“STX M 2 3 ETX” 其中,M是它是什么类型的包的代码,2和3是十六进制0x23=35(cm)。它每15毫秒发送一次新的测量值

现在来谈谈我的问题。我似乎无法配置Master的USART3来接收这些包。 这是我当前的代码:

void USARTInit(void)
{
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef  USART_ClockInitStructure;
GPIO_InitTypeDef GPIO_InitStructure_UART,GPIO_InitStructure_UART_PD9;

//RCC_APB1Periph_AFIO;
//UART3 for communication with other STM (Master -> Slave / Master <- Slave)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

USART_ClockStructInit(&USART_ClockInitStructure);
USART_ClockInit(USART3, &USART_ClockInitStructure);

USART_InitStructure.USART_BaudRate = 9600; //115200; //19200;//57600;//19200; //9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;         //Word lenght, 8b = 8bit = 1byte
USART_InitStructure.USART_StopBits = USART_StopBits_1;              //Num stoppbits
USART_InitStructure.USART_Parity =  USART_Parity_No ;               //USART_Parity_Odd;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;     //Full duplex mode
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_Init(USART3, &USART_InitStructure);

//GPIO pins configuration
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);     //UART3 + TIM4

GPIO_InitStructure_UART.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure_UART.GPIO_Mode  = GPIO_Mode_AF;                  //Alternative func, here UART
GPIO_InitStructure_UART.GPIO_Speed = GPIO_Speed_Level_1;
GPIO_InitStructure_UART.GPIO_OType = GPIO_OType_PP;                 //PushPull

GPIO_Init(GPIOD, &GPIO_InitStructure_UART);                         //Tx - Transmit
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_7);                //GPIO_AF_7 -> U(S)ART mode

GPIO_InitStructure_UART.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure_UART.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure_UART.GPIO_PuPd  = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOD, &GPIO_InitStructure_UART);                         //Rx - Recieve
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_7);

USART_Cmd(USART3, ENABLE);


USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitTypeDef nvicStructure;                             //Create a "extern" interupt base
nvicStructure.NVIC_IRQChannel = USART3_IRQn;                //Link it to the global interupt of usart3
nvicStructure.NVIC_IRQChannelPreemptionPriority = 0;        //Unsure
nvicStructure.NVIC_IRQChannelSubPriority = 0;               //The priority of this interupt if you have other external interupts
nvicStructure.NVIC_IRQChannelCmd = ENABLE;                  //enables it
NVIC_Init(&nvicStructure);                                  //Sends it to the Interupt handler

}
问题似乎是
USART\u ReceiveData(USART 3)
,如果我去掉is,我会看到所有的二极管都一直亮着,这意味着一定有什么东西在很快地一遍又一遍地通过这个代码,但是如果我像这样离开,第一盏灯亮起(即第一次迭代),那么什么也不会发生。使用“我的电脑”并在处理程序中添加breakporints会显示temp变量始终为空。它只运行一次,然后什么都没有。我怀疑国旗没有被正确处理,所以我试着。。。一些解决方案

//USART_ClearITPendingBit(USART3,USART_IT_ORE);
//USART_ClearITPendingBit(USART3, USART_IT_LBD);
//USART_ClearITPendingBit(USART3, USART_IT_CTS);
//USART_ClearITPendingBit(USART3, USART_IT_TC);
我之前有过这段代码,但没什么区别

我已经花了两天的时间试图找出问题所在,但我和刚开始的时候没什么关系。
我试着在谷歌上搜索,有无数不同的答案,但我找不到任何解决我问题的方法。如果解决方案非常明显,我很抱歉…

我不拥有此电路板,但有两个建议:1)使用USART_ClearITPendingBit删除该行2)从(&0xff)中删除逐位运算符。如果它对你有效,那么我将提交一个完整的答案,解释发生了什么。如果不工作,请尝试使用USART echo模式进行调试,首先尝试在不使用中断的情况下接收数据。祝你好运嗨,老师今天来实验室帮助我,他告诉我如何打开周边视图来查看各种附加信息。显然,有一些不应该被切换的标志(因为我在配置之前没有初始化它,所以它们保持高)以及所使用的pin,因为它被配置为另一段代码中其他地方的输出,所以一直在争论。抱歉浪费你们的时间!不用担心,很高兴你能用上。您的最后一条评论看起来是对您的问题的一个很好的回答,也许值得将其作为一个答案发布;)。干杯
//USART_ClearITPendingBit(USART3,USART_IT_ORE);
//USART_ClearITPendingBit(USART3, USART_IT_LBD);
//USART_ClearITPendingBit(USART3, USART_IT_CTS);
//USART_ClearITPendingBit(USART3, USART_IT_TC);