 <p>I don't see you clearing the interrupt. Some UART peripherals require you to clear the interrupt or the interrupt will continue to cycle. Some will clear the interrupt automatically when the data register is read, though, so refer to the peripheral documentation. In my experience an uncleared interrupt is often the cause of a perpetually cycling interrupt.</p> <p>Also, I'm unconvinced it's your problem but, you shouldn't need the</p> <pre><code>MOVS R0, #1 ; MASK all interrupts MSR PRIMASK, R0 </code></pre> <p>and </p> <pre><code>MOVS R0, #0 ; ENABLE all interrupts MSR PRIMASK, R0 </code></pre> <p>sections of code. You shouldn't have to mask any interrupts while in an interrupt. If you're executing from an interrupt context, having properly configured interrupt priorities will stop other interrupts from triggering. </p> <p>Like others say, based on how you're using it, you shouldn't need the assembly code at all, just name your C function "UART_Handler".</p>