2022-07-08 11:48 PM
I am using STM32L451RCTx in STM32CubeIDE. I need to response through usart2 for the received request on the same usart2. I am receiving the request one time and can able respond for that. After the transmission of the response, I am not able to receive the request. Usart2 receive interrupt is not called whenever data received on the usart lines.
--> In Init side,
static void MX_USART2_UART_Init(void)
{
/* USER CODE BEGIN USART2_Init 0 */
/* USER CODE END USART2_Init 0 */
/* USER CODE BEGIN USART2_Init 1 */
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
if(HAL_UART_Receive_IT(&huart2, &uart2_buffer_u8, 1))
{
Error_Handler();
}
/* USER CODE END USART2_Init 2 */
}
--> In Interrupt handler side,
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
CLEAR_BIT(huart2.Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
/* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
CLEAR_BIT(huart2.Instance->CR3, USART_CR3_EIE);
/* Rx process is completed, restore huart->RxState to Ready */
huart2.RxState = HAL_UART_STATE_READY;
/* Clear RxISR function pointer */
huart2.RxISR = NULL;
uint8_t status = 0;
status = HAL_UART_Receive_IT(&huart2, &uart2_buffer_u8, 1);
if (status || huart2.ErrorCode != 0 || huart2.ErrorCode != 34) {
/* error handler */
/* Re-Initialize to avoid missing of messages */
status = HAL_UART_Receive_IT(&huart2, &uart2_buffer_u8, 1);
if (status) {
/* error handler */
}
}
//USART_ClearITPendingBit(&huart2,USART_IT_TC);
/* USER CODE END USART2_IRQn 1 */
}
--> Interrupt Call back function
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if(huart->Instance == USART2)
{
mgmtLocalRx = uart2_buffer_u8;
if ((mgmtLocalRx == FRAMEHEAD) && (mgmtBMS_RxCounter != 0)) {
mgmtBMS_RxCounter = 0;
mgmtBMS_Rx_Buffer[mgmtBMS_RxCounter++] = mgmtLocalRx;
}
else if ((mgmtLocalRx == FRAMEHEAD) && (mgmtBMS_RxCounter == 0)) {
mgmtBMS_Rx_Buffer[mgmtBMS_RxCounter++] = mgmtLocalRx;
}
else if ((mgmtBMS_RxCounter < 5) && (mgmtBMS_RxCounter != 0)){
mgmtBMS_Rx_Buffer[mgmtBMS_RxCounter++] = mgmtLocalRx;
}
else if ((mgmtLocalRx == FRAMEEND) && (mgmtBMS_RxCounter >= 5)){
mgmtBMS_Rx_Buffer[mgmtBMS_RxCounter++] = mgmtLocalRx;
uartRxSection = true;
mgmtBMS_RxCounter = 0;
}
}
}
Anybody knows how to fix this issue, Please help to fix this.
2022-07-09 12:22 AM
Remove the code from USART ISR, starting with /* USER CODE BEGIN USART2_IRQn 1 */
Most of this (fiddling with int sources) is not needed, the rest should be moved to callback.
Anyway, I will never understand why the people use HAL USART services which are almost unusable in real world.
2022-07-09 01:03 AM
Cube/HAL as such is usable only for a very limited number of problems, arguably the typical ones. But the comfort of clicking and lack of proper examples and leadership prevails.
JW
2022-07-09 01:22 AM
thanks for reply
i have changed, but still remains same.
Usart2 receive interrupt is not called whenever data received on the usart lines.
2022-07-09 01:38 AM
Does the receiver work? Isn't it stuck with overflow?
JW
2022-07-09 01:57 AM
thanks,
I am receiving the request one time at beginning and can able respond for that. After the transmission of the response, I am not able to receive the request.
Please, how to check the overflow.