菜鸟写的经验,大佬勿喷!!
最近在搞stm32的接收通信,用的正点原子的例程,打算用串口2进行通信,然后发现各种各样的的问题.比如只能收到一个字符,只能收到首个和末尾两个字符,收到字符时死机…等等一堆问题。 调了一下午,发现。。。原来是我在USART2_IRQHandler中断函数里面用了正点原子的printf();正点原子这个printf函数已经重映射到串口1了,这样的话就相当于在USART2_IRQHandler中断函数里面嵌套了另外一个串口发送中断。问题就是自己定义的usart2中断优先级比printf的优先级还要高,然后就死在USART2_IRQHandler函数里了。。。出现什么只接收一个或两个字符也是这个问题的不同版本(你的printf函数放在不同位置。)
综上所述,在用正点原子提供的例程调试其他串口时,要注意中断优先级,最好不要在串口中断函数里面用printf函数来调试!! 最后放一下我的串口接收字符串函数,记得千万别用printf去调试!!!谨记
char USART_ReceiveString[50];
int Receive_sum = 0;
void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
res =USART_ReceiveData(USART2);
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
if(res!=0x0d&&res!=0x0a)
{
if(Receive_sum==0)
{
memset(USART_ReceiveString,0,sizeof(USART_ReceiveString));
}
USART_ReceiveString[Receive_sum]=res;
Receive_sum++;
}
else
{
Receive_sum=0;
}
}
}
串口发送字符串函数
void USART_SendString(USART_TypeDef* USARTx, char *DataString)
{
int i = 0;
USART_ClearFlag(USARTx,USART_FLAG_TC);
while(DataString[i] != '\0')
{
USART_SendData(USARTx,DataString[i]);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == 0);
USART_ClearFlag(USARTx,USART_FLAG_TC);
i++;
}
}
|