2021-01-05 02:30 PM
I am using USART2 on the G474 processor, and I only want the TXE and RXNE interrupts to fire. To do so, I wrote the following:
//Enable/set the TXE and RXNE interrupt bits
__HAL_USART_ENABLE_IT(&husart2, USART_IT_TXE);
__HAL_USART_ENABLE_IT(&husart2, USART_IT_RXNE);
//Disable all other USART interrupts:
__HAL_USART_DISABLE_IT(&husart2, USART_IT_RXFF);
__HAL_USART_DISABLE_IT(&husart2, USART_IT_TXFE);
__HAL_USART_DISABLE_IT(&husart2, USART_IT_RXFT);
__HAL_USART_DISABLE_IT(&husart2, USART_IT_TXFT);
__HAL_USART_DISABLE_IT(&husart2, USART_IT_TXFNF);
__HAL_USART_DISABLE_IT(&husart2, USART_IT_TC);
__HAL_USART_DISABLE_IT(&husart2, USART_IT_RXFNE);
__HAL_USART_DISABLE_IT(&husart2, USART_IT_IDLE);
__HAL_USART_DISABLE_IT(&husart2, USART_IT_PE);
__HAL_USART_DISABLE_IT(&husart2, USART_IT_ERR);
//Set the priority of the UART interrupt:
HAL_NVIC_SetPriority(USART2_IRQn, 3, 0); //(IRQ, priority, subpriority) - lower priority number is higher importance
HAL_NVIC_EnableIRQ(USART2_IRQn);
However, as soon as I enable the USART2 IRQ, I get USART interrupts triggering (which locks up any other code). The USART interrupts I'm getting are the following:
TXE, TXFNF (TX FIFO not full), TC (transmission complete), and IDLE.
I know this because of my interrupt debug code (shown in this screenshot):
Why am I getting USART interrupts that I have not enabled?
2021-01-05 02:41 PM
>>Why am I getting USART interrupts that I have not enabled?
Probably because the register you are reading is flagging internal states, which is then masked by the enable register as it gates those into the interrupt request (singular) which feeds into the NVIC.
Things like TXE will keep asserting if you don't feed in data, if that interrupt is enabled the handler will continuously tail-chain.