初级会员 
  
	- 积分
 - 148
 
        - 金钱
 - 148 
 
       - 注册时间
 - 2016-5-17
 
      - 在线时间
 - 29 小时
 
 
 
 | 
 
1金钱 
 
//初始化IO 串口1  
//bound:波特率 
void uart_init(u32 bound) 
{         
        //UART 初始化设置 
        UART1_Handler.Instance=USART1;                                            //USART1 
        UART1_Handler.Init.BaudRate=bound;                                    //波特率 
        UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长为8位数据格式 
        UART1_Handler.Init.StopBits=UART_STOPBITS_1;            //一个停止位 
        UART1_Handler.Init.Parity=UART_PARITY_NONE;                    //无奇偶校验位 
        UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控 
        UART1_Handler.Init.Mode=UART_MODE_TX_RX;                    //收发模式 
        HAL_UART_Init(&UART1_Handler);                                            //HAL_UART_Init()会使能UART1 
         
        HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 
 
} 
 
//UART底层初始化,时钟使能,引脚配置,中断配置 
//此函数会被HAL_UART_Init()调用 
//huart:串口句柄 
 
void HAL_UART_MspInit(UART_HandleTypeDef *huart) 
{ 
    //GPIO端口设置 
        GPIO_InitTypeDef GPIO_Initure; 
         
        if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化 
        { 
                __HAL_RCC_GPIOA_CLK_ENABLE();                        //使能GPIOA时钟 
                __HAL_RCC_USART1_CLK_ENABLE();                        //使能USART1时钟 
         
                GPIO_Initure.Pin=GPIO_PIN_9;                        //PA9 
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出 
                GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉 
                GPIO_Initure.Speed=GPIO_SPEED_FAST;                //高速 
                GPIO_Initure.Alternate=GPIO_AF7_USART1;        //复用为USART1 
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PA9 
 
                GPIO_Initure.Pin=GPIO_PIN_10;                        //PA10 
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PA10 
                 
#if EN_USART1_RX 
                HAL_NVIC_EnableIRQ(USART1_IRQn);                //使能USART1中断通道 
                HAL_NVIC_SetPriority(USART1_IRQn,3,3);        //抢占优先级3,子优先级3 
#endif         
        } 
 
} 
 
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; 
#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>HAL_MAX_DELAY) break;                 
        } 
 
        timeout=0; 
        while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1 
        { 
         timeout++; //超时处理 
         if(timeout>HAL_MAX_DELAY) 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         
*/ 
 
 
请问 原子哥的这个代码中 串口接收用到了回调函数,请问这个是每产生中断一次就进入一次回调函数,然后不等待回调函数执行完毕就立即返回? 还有就是红色的标中不是必须有 
 
while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1 必须有这句才可以中断呢?我试的时候是这样的 。还有就是RXBUFFERSIZE  这个大小为什么设置为1?每次就接收一个字符吗?   那如果多个数据同时发送这个是怎么处理的呢? 还有就是下面原子哥注释掉的我用的时候怎么不能产生中断呢。求指点 
 
 |   
 
 
 
 
 
 |