2017-11-21 4 views
0

UART 포트를 통해 PC (직렬 모니터)에서 STM32F4 탐색 보드로 요청을 보내면 신호가 수신되지 않습니다. 보드는 일반적으로 이전에받은 것과 동일한 요청으로 응답해야합니다 (UART 미러링). 나는 메시지를 보내거나 받기 위해 인터럽트 (DMA없이)를 사용했다. 인터럽트 서비스 루틴에서 인터럽트 플래그가 설정되었습니다. 이 플래그는 메인 루프에서 읽혀질 것입니다. 나는 콜백 함수를 사용하지 않는다.인터럽트, STM32F4, HAL 드라이버가있는 UART 양식 수신 없음

메인 루프에서 HAL_UART_Transmit (...) 및 HAL_UART_Receive (...) 만 사용하여 인터럽트 서비스를 사용하지 않으면 모든 것이 정상적으로 작동합니다. 하지만 인터럽트와의 통신이 필요합니다.

RUN 모드에서 ISR과 두 개의 if 문에서 중단 점을 사용할 수 있습니다. ISR 루틴에 문제가 있는지 여부를 알고 싶습니다. 그러나 ISR 루틴은 정상적으로 작동합니다. PC의 요청에 따라 ISR 및 수신 if 문이 호출됩니다.

문제는 수신 레지스터가 비어있는 문제입니다. 그리고이 값이 비어 있으면 컨트롤러는 요청 메시지를 보내지 않습니다. 무엇이 잘못 되었나요? 문제가 어디서 나에게 도움이 될 수 있습니까? UART 포트 구성이 올바 릅니까? 도움을 주셔서 감사합니다 &!

volatile enum RxStates { 
UART_RX, DUMMY_RX, WAIT_RX 
} stateRx; 

volatile enum TxStates { 
    UART_TX_READY, DUMMY_TX, WAIT_TX 
} stateTx; 


static UART_HandleTypeDef s_UARTHandle; 
GPIO_InitTypeDef GPIOC2_InitStruct;  //GPIO 

uint8_t empfang[8];      //buffer 


void UART_ini(void) 
{ 
    __HAL_RCC_GPIOA_CLK_ENABLE(); 
    __USART2_CLK_ENABLE(); 

//PIN TX 
    GPIOC2_InitStruct.Pin = GPIO_PIN_2; 
    GPIOC2_InitStruct.Mode = GPIO_MODE_AF_PP; 
    GPIOC2_InitStruct.Alternate = GPIO_AF7_USART2; 
    GPIOC2_InitStruct.Speed = GPIO_SPEED_FAST; 
    GPIOC2_InitStruct.Pull = GPIO_PULLUP; 
    HAL_GPIO_Init(GPIOA, &GPIOC2_InitStruct); 

//PIN RX 
    GPIOC2_InitStruct.Pin = GPIO_PIN_3; 
    GPIOC2_InitStruct.Mode = GPIO_MODE_AF_OD; 
    HAL_GPIO_Init(GPIOA, &GPIOC2_InitStruct); 

//USART2 
    s_UARTHandle.Instance = USART2; 
    s_UARTHandle.Init.BaudRate = 9600; 
    s_UARTHandle.Init.WordLength = UART_WORDLENGTH_8B; 
    s_UARTHandle.Init.StopBits = UART_STOPBITS_1; 
    s_UARTHandle.Init.Parity = UART_PARITY_NONE; 
    s_UARTHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; 
    s_UARTHandle.Init.Mode = UART_MODE_TX_RX; 
    HAL_UART_Init(&s_UARTHandle); 

    __HAL_UART_ENABLE_IT(&s_UARTHandle, UART_IT_RXNE | UART_IT_TC); 

    HAL_NVIC_SetPriority(USART2_IRQn, 15, 15); 
    HAL_NVIC_EnableIRQ(USART2_IRQn);    // Enable Interrupt 

}//UART 


int main(int argc, char* argv[]) 
{ 

//initialization of the interrupt flags 
    stateRx = WAIT_RX; 
    stateTx = WAIT_TX; 

    UART_ini(); //initialization UART 

    while (1) 
    { 
//receive interrupt flag 
     if (stateRx == UART_RX) 
     { 
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET); //set LED 
      HAL_UART_Receive(&s_UARTHandle, empfang, 2, 10000000); //receive message 

      stateRx = WAIT_RX;          //RESET flag 
     } 

//transmit interrupt flag 
     if (stateTx == UART_TX_READY) 
     { 
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET); //set LED 
      HAL_UART_Transmit(&s_UARTHandle, empfang, 2, 10000); //send message 

      stateTx = WAIT_TX;          //RESET flag 
     } 

//RESET LED 
     if (stateTx != UART_TX_READY && stateRx != UART_RX)   
     { 
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, RESET);   //RESET LED 
     } 

    }//while 
}//main 


void USART2_IRQHandler() 
{ 

    if (__HAL_UART_GET_FLAG(&s_UARTHandle, UART_FLAG_RXNE) == SET) 
    { 
     __HAL_UART_CLEAR_FLAG(&s_UARTHandle, UART_FLAG_RXNE);  //clear ISR flag 
     stateRx = UART_RX;           //set RX flag 
    } 

    if (__HAL_UART_GET_FLAG(&s_UARTHandle, UART_FLAG_TC) == SET) 
    { 
     __HAL_UART_CLEAR_FLAG(&s_UARTHandle, UART_FLAG_TC);   //clear ISR flag 
     stateTx = UART_TX_READY;         //set TX flag 
    } 
}//ISR 

//EOF 

답변

0

HAL_UART_Receive 기능으로,이 기능은 UART_FLAG_RXNE 플래그를 기다립니다하지만 RX 인터럽트를 사용할 때 분명이 플래그 USART2_IRQHandler에 일반적으로, 당신은 사용자 버퍼에 수신 된 데이터를 저장하고이를 분석해야합니다.

관련 문제