已经有了DMA+IDLE的模型
BASE模型
陈强的改库函数模型
现在搞点击CSDN看到一个正点原子的工程
增加一个新模型
开启:《它在哪里再次开启的?在最下面的IT》
HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);
回调:
#define RXBUFFERSIZE 1 //缓存大小
u16 USART_RX_STA=0; //接收状态标记
u8 aRxBuffer[RXBUFFERSIZE];//HAL库使用的串口接收缓冲
/*这就是one循环拿数据的*/
#define USART_REC_LEN 200
u8 USART_RX_BUF[USART_REC_LEN];
/*这真正放置数据的*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)//如果是串口1
{
if((USART_RX_STA&0x8000)==0)//接收未完成--第一次这样的都会进来
{
if(USART_RX_STA&0x4000)//接收到了0x0d 已经之前设置了flag
{
if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了 333333333333333
}
else //还没收到0X0D--第一次进这里来
{
if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;//222222222222
else//--第一次进这里来1111111111111
{
USART_RX_BUF[USART_RX_STA++]=aRxBuffer[0] ;
if(USART_RX_STA>(USART_REC_LEN-1))
USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
/*也就是0X0D 0X0A收尾的 是一整*/
/*下面类似空闲中断 一个报文已经好了*/
if(USART_RX_STA&0x8000)
{
USART_RX_STA=0;
switch(USART_RX_BUF[0])
{
case 0x0A: //zhengzhuan
len=0;
LED0(0);
break;
case 0x0B: //tinzhi
len=2;
break;
case 0x0C: //fanzhuan
LED0(1);
len=1;
break;
}
}
}
//IT
//串口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