初级会员

- 积分
- 67
- 金钱
- 67
- 注册时间
- 2019-5-14
- 在线时间
- 19 小时
|
1金钱
实验3例程usart.c使用的是在串口中断函数USART1_IRQHandler中调用HAL_UART_IRQHandler,测试没有问题。
usart.c文件最下面有直接在USART1_IRQHandler中处理中断控制的版本(被注释了)。把上面的USART1_IRQHandler和HAL_UART_IRQHandler注释后改用下面的版本串口就接收不到发送的数据了,其他代码完全没有改动,感觉非常奇怪,查了半天资料不知道错在哪里……
//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
//{
// if(huart->Instance==USART1)//如果是串口1
// {
// if((USART_RX_STA&0x8000)==0)//接收未完成
// {
// if(USART_RX_STA&0x4000)//接收到了0x0d
// {
// if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
// else USART_RX_STA|=0x8000; //接收完成了
// }
// else //还没收到0X0D
// {
// if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
// else
// {
// USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
// USART_RX_STA++;
// if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
// }
// }
// }
// }
//}
//
////串口1中断服务程序
//void USART1_IRQHandler(void)
//{
// u32 timeout=0;
// u32 maxDelay=0x1FFFF;
//#if SYSTEM_SUPPORT_OS //使用OS
// OSIntEnter();
//#endif
//
// HAL_UART_IRQHandler(&UART1_Handler); //调用HAL库中断处理公用函数
//
// timeout=0;
// while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY)//等待就绪
// {
// timeout++;////超时处理
// if(timeout>maxDelay) break;
// }
//
// timeout=0;
// while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1
// {
// timeout++; //超时处理
// if(timeout>maxDelay) break;
// }
//#if SYSTEM_SUPPORT_OS //使用OS
// OSIntExit();
//#endif
//}
//#endif
/*下面代码我们直接把中断控制逻辑写在中断服务函数内部。
说明:采用HAL库处理逻辑,效率不高。*/
///*
//串口1中断服务程序
void USART1_IRQHandler(void)
{
u8 Res;
#if SYSTEM_SUPPORT_OS //使用OS
OSIntEnter();
#endif
if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET)) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
HAL_UART_Receive(&UART1_Handler,&Res,1,1000);
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
HAL_UART_IRQHandler(&UART1_Handler);
#if SYSTEM_SUPPORT_OS //使用OS
OSIntExit();
#endif
}
#endif
|
最佳答案
查看完整内容[请看2#楼]
对照后面实验【28】485的实验,发现是前面开启中断的方式不对。
不用://HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量(使用回调函数处理中断需要调用该函数)
应该是:__HAL_UART_ENABLE_IT(huart,UART_IT_RXNE); //开启接收中断
但是我遇到了另一个问题,为什么485实验里面有__HAL_UART_DISABLE_IT(huart ...
|