(F4HAL串口不定长接收)TIM超时中断

2019-07-20 12:07发布

本帖最后由 胡图图图 于 2017-9-6 17:13 编辑

大家来一起找BUG啊!!!!!!!!!!!!!!!!!!!!!!!!!
小白做了好久,做出来了TIM超时中断,但是有很多BUG。BUG1:第一次接收只能接收一个字节。
BUG2:中断中必须有一个printf输出。

代码:先配置好usart1串口和TIM2(中断时间100ms)定时器。
main.h
#define RXBUFFERSIZE                             1024

main.c
while(1){
        unsigned char IT_Rcv[512];
        HAL_UART_Receive_IT(&huart1,IT_Rcv,RXBUFFERSIZE);
        printf("Rcv:%s ",IT_Rcv);                        
        HAL_Delay(1000);        

}

stm32f4xx_it.c
void TIM2_IRQHandler(void)
{
                        if(__HAL_TIM_GET_ITSTATUS(&htim2,TIM_IT_UPDATE) != RESET)        //是更新中断                                                                                                                                
                        {               

                                //添加结束符        
                                        *(huart1.pRxBuffPtr+(RXBUFFERSIZE-huart1.RxXferCount)) = 0;                                                               
                                //        重置数据接受缓冲区                                       
                                        CLEAR_BIT(huart1.Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
                                        CLEAR_BIT(huart1.Instance->CR3, USART_CR3_EIE);
                                        huart1.RxState = HAL_UART_STATE_READY;
                                       
                                        TIM_GET_CLEAR_IT(&htim2,TIM_IT_UPDATE);        //清除TIM2更新中断标志        
                                        HAL_TIM_Base_Stop_IT(&htim2);        //关闭TIM2        
                                        printf("& ");
                        }           

}


void USART1_IRQHandler(void)
{

                unsigned char        res;               
               
    if( huart1.RxState == HAL_UART_STATE_BUSY_RX )
    {               
                        
                        res = (uint8_t)(huart1.Instance->DR & (uint8_t)0x00FFU);                                                
                        
                                if( (RXBUFFERSIZE-huart1.RxXferCount)<RXBUFFERSIZE )          //还可以接收数据
                                {
                                __HAL_TIM_SetCounter(&htim2,0);                                        //计数器清空                                 
                                       
                                                if( (RXBUFFERSIZE-huart1.RxXferCount)==0 ){               
                                                        HAL_TIM_Base_Start_IT(&htim2);                 //使能定时器7         
                                                        *huart1.pRxBuffPtr++ = res;                       //记录接收到的值                        
                                                }else{                                                                        
                                                        *huart1.pRxBuffPtr++ = res;                      //记录接收到的值        
                                                        *(huart1.pRxBuffPtr+(RXBUFFERSIZE-huart1.RxXferCount)) = 0;                        //添加结束符        
                                                        //        重置数据接受缓冲区                                       
                                                        CLEAR_BIT(huart1.Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
                                                        CLEAR_BIT(huart1.Instance->CR3, USART_CR3_EIE);
                                                        huart1.RxState = HAL_UART_STATE_READY;
                                                        printf(" Error ");
                                                }
                                        }               
                        }

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
正点原子
1楼-- · 2019-07-20 15:09
可以利用串口空闲中断来做,论坛很多参考
胡图图图
2楼-- · 2019-07-20 19:15
正点原子 发表于 2017-9-7 00:15
可以利用串口空闲中断来做,论坛很多参考

DMA+空闲中断我做了,很多例子和源码。
定时器中断是借鉴原子哥之前用标准库写的改写成的,但是我写的代码有好多问题

一周热门 更多>