2014-01-13 20 views
6

私はRXとTXを同時に実行しようとすると、RTS CTSを使用して921600 BaudRateでUSART3を実行しています。メインとIRQコードを貼り付けました。 IRQは、受信したすべてのデータを削除しながら、char 'A'を送信するように設計されています。あなたはそれを無効にする前に、我々はUSART_ITConfig(USART3, USART_IT_TXE, DISABLE);Stm32L151RCxxx USARTハングの問題、割り込みベースのTX/RX同時

Uart_Configuration()を無効にするとハングが起こる...

USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; 
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; 
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; 
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; 
USART_ClockInit(USART3, &USART_ClockInitStructure); 

USART_InitStructure.USART_Mode = (USART_Mode_Tx|USART_Mode_Rx); 
USART_InitStructure.USART_BaudRate = u32BaudRate; 
USART_OverSampling8Cmd(USART3, DISABLE); 
USART_InitStructure.USART_Parity = USART_Parity_No ; 
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS; 
USART_InitStructure.USART_WordLength = USART_WordLength_8b; 
USART_InitStructure.USART_StopBits = USART_StopBits_1; 

USART_Init(USART3, &USART_InitStructure); 
USART_ITConfig(USART3,USART_IT_TXE, DISABLE); 
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); 
USART_Cmd(USART3, ENABLE); 

main.cの...

uint8_t UART_TransmitData(void) 
{ 
    if(u8IntTxFlag==1) 
    { 
     u8IntTxFlag=0; 
     USART_ITConfig(USART3, USART_IT_TXE, ENABLE);  
     return TRUE; 
    } 
    return FALSE; 
} 


void USART3_IRQHandler(void) 
{ 
    /* Implemented full duplex serial communication */ 
    /* UART RX */ 
    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) 
    { 
    USART_ReceiveData(USART3); 
    } 

    /* UART TX */ 
    if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET) 
    { 
    if(USART_GetFlagStatus(USART3, USART_FLAG_CTS) == RESET) 
    { 
     while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); 
     USART_SendData(USART3, 'A'); 
     while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); 
     USART_ClearFlag(USART3, USART_FLAG_TC); 
     USART_ITConfig(USART3, USART_IT_TXE, DISABLE); 
     u8IntTxFlag=1; 
    } 
    else 
    { 
     USART_ClearFlag(USART3, USART_FLAG_CTS); 
    } 
    } 
} 


int main(void) 
{ 
    RCC_ClocksTypeDef RCC_Clocks; 

    RCC_Configuration(); 
    RCC_GetClocksFreq(&RCC_Clocks); 
    SysTick_Config(RCC_Clocks.HCLK_Frequency/2000); 

    NVIC_Configuration(); 

    Init_GPIOs(); 

    SerialUARTConfig(921600, 0, 1, 8, 1); 

       while(1) 
       { 
           UART_TransmitData(); 
           f_SleepMs(5); 

       } 
       return 0; 
} 
+2

ロジックにデッドロックがある可能性があります。 SWDデバッガーを接続し(STM32ディスカバリー・ボードのどれか)、ハングアップしているか、ハングアップしていないが、クラッシュしてフォルト・ハンドラーに終わっているかどうかを調べます。また、UARTエラーフラグが設定されている可能性(ラインノイズ、ボーレート、バッファオーバーフロー)を考慮してクリアすることもできます。 –

+0

USARTクロックを無効にする必要がありますか? 'USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;' –

+0

gpioピンを使ってデバッグし、別の場所に設定/リセットしようとしましたか?そうすれば、コードのどの部分が無限ループになっているかを追跡できます。 – Shahbaz

答えて

4

たぶんUSART_IT_TXE割り込みが起こりますか?したがって、 "Tx empty"割り込みペンディングフラグはすでに設定されており、そのフラグをクリアするIRQHandler内のプロシージャは存在しません。

関連する問題