2020-07-24 08:01 AM
i use stm32f407vgt chip with my own board design
and working on STM32CubeIDE_1.3.0
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
//USART3->SR &= ~USART_SR_RXNE;
LL_USART_ClearFlag_RXNE(USART3);
static unsigned char iteration,buffer[4],validation;
unsigned char data;
data = USART3->DR; // the character from the USART1 data register is saved in t
dat3 = data;
dat6 = validation;
if(data == 'Z')
{
validation = 1;
iteration = 0;
}
else if(validation == 1)
{
if(data == 'Y')
{
validation = 2;
}
else validation = 0;
}
else if(validation == 2)
{
buffer[iteration]=data;
iteration++;
if(iteration == 4)
{
//move to global variable
acc_y = buffer[0];
acc_x = buffer[1];
gyro_p = buffer[2];
gyro_r = buffer[3];
//convert to signed integer
if(acc_y >= 128) acc_y -= 256;
if(acc_x >= 128) acc_x -= 256;
if(gyro_p >= 128) gyro_p -= 256;
if(gyro_r >= 128) gyro_r -= 256;
//to get value 0 at default pose
acc_x -= acc_x_offset;
acc_y -= acc_y_offset;
gyro_p -= gyro_p_offset;
gyro_r -= gyro_r_offset;
iteration = 0;
validation = 0;
}
}
/* USER CODE END USART3_IRQn 0 */
/* USER CODE BEGIN USART3_IRQn 1 */
/* USER CODE END USART3_IRQn 1 */
}
I prefer as much as possible using the default function in LL driver for good regeneration
2020-07-24 08:25 AM
Why do you even need to explicitly clear it? Reading UART->DR auto clears it, if it sets again there's new data.
2020-07-24 08:35 AM
somehow I can't get out from the irq handler even if USART-> DR has been read
2020-07-24 09:10 AM
Yeah, then something else is enabled and not satiated by your code. Perhaps TXE interrupt is enabled. Or some error status is flagged, and does need clearing.
Normally you'd inspect the SR, not really providing sufficient info here to understand the cause of the problem, just the symptoms.
2020-07-24 10:54 AM
Thank you very much for spending your time
this is quite strange to me, it doesn't work on USART3 but it works well on UART5
2024-06-25 05:58 AM
I know this is an old post, but I think this could be of some help as i t was to me today.
I followed Tesla DeLorean suggestion and did this:
void UART4_IRQHandler(void)
{
/* USER CODE BEGIN UART4_IRQn 0 */
if(!LL_USART_IsActiveFlag_RXNE(UART4))
return;
uint8_t c=LL_USART_ReceiveData8(UART4);
.....