I noticed the timer interrupt handlers use the __DSB(); bus sync function. Do other interrupt service routine require this as well?
With timers in particular if they're running from the 32KHz clock source the __DSB() instruction is needed so that the interrupt function isn't existed before the interrupt is cleared, which would mean that as soon as you exit the interrupt function the cortex jumps back into it even though there isn't actually a second interrupt.
So you can put the __DSB function in any interrupts that you clear at the end, but of the top of my head for the rest of the peripherals you're clearing the interrupt near the start of the function, by either reading status bits, or reading data from a DAT or RX register or even clearing the interrupt manually by writing to a CLR register.
The essential point is, the _DSB() is required if your peripherals clock-source is differs from the core.
So a sync is required - specifically if the clocks have a larger difference.
That's not the only time a __DSB instruction is required.
When changing the value of cortex core registers such as SHCSR various example codes recommend calling both __DSB() and __ISB() which flushes the instruction and data pipelines to insure assertion of new settings
My explanation would be that a __DSB() is required when you want to make sure a write to a register has been completed before proceeding to the next instruction.
Retrieving data ...