Ich benutze USART3, auf 921600 BaudRate, mit RTS CTS, ich stehe immer System hängen, wenn ich versuche, RX und TX gleichzeitig zu tun. Ich habe den Haupt- und IRQ-Code eingefügt. IRQ wurde entwickelt, um ein Zeichen 'A' zu übertragen, während alle empfangenen Daten gelöscht werden. Hängt passiert, wenn wir USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
Stm32L151RCxxx USART Hang-Problem, Interrupt-basierte TX/RX gleichzeitig
Uart_Configuration() deaktivieren ...
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;
}
Sie haben wahrscheinlich einen Deadlock in Ihrer Logik. Schließen Sie einen SWD-Debugger an (jedes der STM32-Discovery-Boards tut das) und finden Sie heraus, wo es hängt, oder ob es nicht hängt, sondern abstürzt und in einem Fehlerbehandler endet. Außerdem sollten Sie die Möglichkeit in Betracht ziehen, dass UART-Fehlerflags gesetzt werden (Leitungsrauschen oder bei Ihrer Baudrate, Pufferüberlauf) und diese löschen. –
Sollten Sie die USART-Uhr deaktivieren? 'USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;' –
Haben Sie versucht, einen gpio Pin zum Debuggen und zum Setzen/Zurücksetzen an verschiedenen Orten zu verwenden? Auf diese Weise können Sie verfolgen, welcher Teil des Codes in einer Endlosschleife ist. – Shahbaz