Currently, I use a stm32f401 under keil arm uvison ( gcc), but I'm using avr 328p for other projects under Atmel studio ( gcc as well)!
Neither case is an mcu to avoid printf/snprintf.
The avr printf is lightweight and easy to use. The arm takes some work to hook up printf to a destination, but snprintf is easy to use and is used the same for any mcu or pc, and your particular arm could fit printf on its little pinky fingernail. You can be 'bare metal' and still know when its better to use something that already exists.
avr printf (no great need to avoid printf in favor of snprintf as hooking up printf to a function is easy)-
https://godbolt.org/z/dGxG5a6Gh(printf library increases code size by about 1.5k)
pc printf can be used to test-
https://godbolt.org/z/5qz7T6MeeWith the standard printf/snprintf you will have documentation, the ability to use/test on any mcu or pc, can get rid of all the little custom formatting functions you may be trying to use now, and once you start to use it you will wonder why you were trying to replace it.
An snprintf type for the arm where the buffer is on the stack, formatted, sent away to a function (which could put it in its own buffer, or direct to hardware), and returns when done (buffer on stack gets destroyed on return, but is ok since already transferred/used)-
https://godbolt.org/z/q7K3n5Mzz should be vsnprintf, not snprintf
https://godbolt.org/z/e1casGbbn(vsnprintf adds about 3k in code size)
Lots of variations to get the same results, but the common denominator is you are dealing with the same printf style format description syntax.