2017-11-21 57 views
0

UARTポートを介してPC(シリアル・モニタ)からSTM32F4ディスカバリ・ボードにリクエストを送信すると、信号は受信されません。ボードは通常、以前に受信した要求(UARTミラーリング)で応答する必要があります。私は、メッセージを送信または受信するために割り込み(DMAなし)を使用しました。割り込みサービスルーチンでは、割り込みフラグがセットされています。このフラグはメインループで読み取られます。私はコールバック関数を使用していません。割り込みなしのUART、STM32F4、HALドライバ

メインループでHAL_UART_Transmit(...)とHAL_UART_Receive(...)のみを使用する割り込みサービスがないとすべて正常に動作します。しかし、私はインタラプトとのコミュニケーションが必要です。

RUNモードでは、ISRと2つの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で通常、ユーザー・バッファに受信したデータを保存し、それを解析する必要があります。

関連する問題