I have to write code for an stm32 microcontroller using the low level library for uni. Part of the assignment is to send and receive data using UART.
My problem is:
In my USART interrupt handler I enable the TXE interrupt when i receive specific things. My idea was that enabling the interrupt and then leaving the function would call the TXE interrupt, returning me to the same function and executing some other code. But the TXE interrupt doesn’t take me back to my function. Instead I have to send some new data to trigger the RXNE interrupt.
My interrupt handler is down below. Any help is aprecciated.
(Sry for the unnecessary tabs)
void USART2_IRQHandler(void)
{
if(LL_USART_IsActiveFlag_RXNE(USART2))
{
int recvd;
recvd = LL_USART_ReceiveData8(USART2);
if((recvd>0)&&(recvd<10))
{
addr = recvd-1;
LL_USART_EnableIT_TXE(USART2);
}
switch (recvd)
{
case 0:
if(((mode=='s')||(mode=='l'))&&(dec_point==1))
{
addr=231;
LL_USART_EnableIT_TXE(USART2);
}
break;
case 10:
if((mode=='s')&&(score_addr>146))
{
score_addr--;
}
return;
case 11:
if((mode=='s')&&(score_addr<151))
{
score_addr++;
}
return;
case 12:
if(mode=='s')
{
switch (dec_point)
{
case 0:
dec_point=1;
return;
case 1:
dec_point=0;
return;
}
}
if(tower_height>0)
{
tower_height--;
}
LL_TIM_OC_SetCompareCH1(TIM3, 610 + tower_height*58);
return;
case 13:
if(tower_height<10)
{
tower_height++;
}
LL_TIM_OC_SetCompareCH1(TIM3, 610 + tower_height*58);
return;
case 14:
switch (mode)
{
case 't':
mode='l';
step=0;
return;
case 'l':
mode='s';
score_addr=146;
dec_point=0;
step=0;
return;
case 's':
mode='t';
step=0;
return;
}
break;
case 15:
mode='g';
step=0;
game_tmp=0;
score_addr=146;
game_num_towers=4;
for(int i=0; i<game_num_towers; i++)
{
game_towers[i]=i;
game_heights[i]=i+1;
}
LL_USART_EnableIT_TXE(USART2);
LL_USART_TransmitData8(USART2, 1);
break;
case 16:
addr=1;
LL_USART_EnableIT_TXE(USART2);
LL_USART_TransmitData8(USART2, 1);
break;
}
if(LL_USART_IsActiveFlag_TXE(USART2))
{
switch (mode)
{
case 't':
LL_USART_TransmitData8(USART2, 128+addr);
LL_USART_DisableIT_TXE(USART2);
break;
case 'l':
switch (step)
{
case 0:
LL_USART_TransmitData8(USART2, 137+addr);
LL_USART_DisableIT_TXE(USART2);
step=1;
break;
case 1:
LL_USART_TransmitData8(USART2, led_height(addr+1));
LL_USART_DisableIT_TXE(USART2);
step=0;
break;
}
break;
case 's':
switch (dec_point)
{
case 0:
switch (step)
{
case 0:
LL_USART_TransmitData8(USART2, score_addr);
step=1;
case 1:
LL_USART_TransmitData8(USART2, led_height(addr+1));
LL_USART_DisableIT_TXE(USART2);
step=0;
break;
}
break;
case 1:
switch (step)
{
case 0:
LL_USART_TransmitData8(USART2, score_addr+15);
step=1;
case 1:
if(addr==231)
{
LL_USART_TransmitData8(USART2, 0);
}
else
{
LL_USART_TransmitData8(USART2, 1);
}
LL_USART_DisableIT_TXE(USART2);
step=0;
break;
}
break;
}
break;
case 'g':
switch (step)
{
case 0:
if(game_tmp==game_num_towers)
{
step=4;
game_tmp=0;
return;
}
LL_USART_TransmitData8(USART2, game_towers[game_tmp]+128);
step=1;
break;
case 1:
LL_USART_TransmitData8(USART2, game_towers[game_tmp]+137);
step=2;
break;
case 2:
LL_USART_TransmitData8(USART2, led_height(game_heights[game_tmp]));
game_tmp++;
step=0;
break;
}
break;
}
}
}
}
I already tried writing through the USART to reset the TXE flag. I also tried a lot of combinations of return and break.