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;
}
ロジックにデッドロックがある可能性があります。 SWDデバッガーを接続し(STM32ディスカバリー・ボードのどれか)、ハングアップしているか、ハングアップしていないが、クラッシュしてフォルト・ハンドラーに終わっているかどうかを調べます。また、UARTエラーフラグが設定されている可能性(ラインノイズ、ボーレート、バッファオーバーフロー)を考慮してクリアすることもできます。 –
USARTクロックを無効にする必要がありますか? 'USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;' –
gpioピンを使ってデバッグし、別の場所に設定/リセットしようとしましたか?そうすれば、コードのどの部分が無限ループになっているかを追跡できます。 – Shahbaz