当前位置:网站首页>Serial port receives a packet of data

Serial port receives a packet of data

2022-07-08 00:56:00 Zelonal

With single chip microcomputer N32G435 For example , Serial communication is GPS, Cooperation timer 2 Receive a packet of data .
By continuously updating the timer in the serial port receiving interrupt 2 The count of , Until the timer 2 Interrupt overflow ( General timing 10ms), Indicates that a packet of data has been received .
In the course of debugging , It is found that the receive interrupt has only entered once , A string received only one character , After online inquiry, several solutions have been obtained , as follows :

  1. The interrupt program takes too long , As a result, subsequent data cannot be received when it arrives .
  2. Interrupt clear flag bit .
  3. Serial port interrupt priority is too low , Cause interrupt nesting . Set the priority to the highest .

Interrupt clearing has been added to my interrupt function , It also improves interrupt priority , But it didn't solve , Later, it was found that... In the receiving function would be interrupted printf(); Function delete , Found to return to normal , Should be printf(); The function takes too long to receive the following data !!
Next, I will make a note of the configuration process and processing :

//  Timer 2 Initialize configuration 
void TIM2_Int_Init(u16 arr,u16 psc)
{
	TIM_TimeBaseInitType TIM_TimeBaseInitStructure;
	NVIC_InitType        NVIC_InitStructure;
	
	RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM2,ENABLE);  /// Can make TIM2 The clock 
	
  	TIM_TimeBaseInitStructure.Period = arr; 	// Automatic reload load value 
	TIM_TimeBaseInitStructure.Prescaler=psc;  // Timer frequency division 
	TIM_TimeBaseInitStructure.CntMode=TIM_CNT_MODE_UP; // Upcount mode 
	TIM_TimeBaseInitStructure.ClkDiv=TIM_CLK_DIV1; 
	
	TIM_InitTimeBase(TIM2,&TIM_TimeBaseInitStructure);// initialization TIM2
	TIM_ConfigInt(TIM2,TIM_INT_UPDATE,ENABLE); // Allow timer 3 Update interrupt 
	TIM_Enable(TIM2,DISABLE); // First disable timer 3
	
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; // Timer 3 interrupt 
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; // preemption 1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; // Sub priority 3
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_ClrIntPendingBit(TIM2,TIM_INT_UPDATE);  // Clears the interrupt flag bit 
}
//  Timer 2 Interrupt function processing 
void TIM2_IRQHandler(void)
{
	if(TIM_GetIntStatus(TIM2,TIM_INT_UPDATE)==SET) // Overflow interrupt 
	{
		Uart3DataNeedProcessFlag=1;// Need to process current data 
		TIM_Enable(TIM2,DISABLE);// Stop timer 
		TIM_ClrIntPendingBit(TIM2,TIM_INT_UPDATE);  // Clears the interrupt flag bit   
	}
}
//GPS-UART To configure 
void Uart3Init (void)
{	
	GPIO_InitType   GPIO_InitStructure;
    USART_InitType  USART_InitStructure;
    NVIC_InitType   NVIC_InitStructure;
	
    // Turn on the clock 
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB,ENABLE); 
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_UART5,ENABLE);

    //GPIO Mouth configuration 
    GPIO_InitStructure.Pin 			  = GPIO_PIN_8 ; //
    GPIO_InitStructure.GPIO_Mode      = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF6_UART5;
    GPIO_InitPeripheral(GPIOB,&GPIO_InitStructure); //
    
	GPIO_InitStructure.Pin 			  = GPIO_PIN_9;
	GPIO_InitStructure.GPIO_Pull      = GPIO_Pull_Up;
	GPIO_InitStructure.GPIO_Alternate = GPIO_AF6_UART5;
	GPIO_InitPeripheral(GPIOB,&GPIO_InitStructure); //
	
	//UART To configure 
	USART_InitStructure.BaudRate 	         = 9600;// Serial port baud rate 
	USART_InitStructure.WordLength           = USART_WL_8B;// The word is 8 Bit data format 
	USART_InitStructure.StopBits             = USART_STPB_1;// A stop bit 
	USART_InitStructure.Parity               = USART_PE_NO;// No parity bit 
	USART_InitStructure.HardwareFlowControl  = USART_HFCTRL_NONE;// No hardware data flow control 
	USART_InitStructure.Mode                 = USART_MODE_RX | USART_MODE_TX;	// Transceiver mode 
	USART_Init(UART5, &USART_InitStructure); // 

    // Interrupt configuration 
 	NVIC_InitStructure.NVIC_IRQChannel                   = UART5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2 ;       // preemption 2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 2;        // Sub priority 2
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;   //IRQ Channel enable 
    NVIC_Init(&NVIC_InitStructure); // Initialize... According to the specified parameters VIC register 
    
    USART_ConfigInt(UART5, USART_INT_RXDNE, ENABLE);
    USART_Enable(UART5, ENABLE);  
}
// Interrupt function processing , You need to put this function into the corresponding interrupt function 
void GPS_IRQHandler(void)
{
	volatile u8 Res;	
	if(USART_GetIntStatus(UART5,USART_INT_RXDNE)!=RESET)
	{		
			Res=USART_ReceiveData(UART5); 
			if(Uart3DataNeedProcessFlag==0)  
			{
				if(Uart3ReceiveDataNum<=UART3_RECEIVE_MAX_NUM)		
				{
					Uart3ReceiveData[Uart3ReceiveDataNum++] = Res;
					TIM_ClrIntPendingBit(TIM2,TIM_INT_UPDATE);// Clear timer overflow interrupt 	
					TIM_Enable(TIM2,ENABLE);// Start timing 			
					TIM_SetCnt(TIM2,0);// Reset timer 
				}
				else
				{				
					Uart3ReceiveDataNum=0;
					Uart3DataNeedProcessFlag=1;
				}
			}
	}	 
}
原网站

版权声明
本文为[Zelonal]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/189/202207072310112575.html