What I do find strange however is (..) with an expensive ARM STM32F I can only use 8
On ARMs you can use as many software program breakpoints as you like. No problem to fill all the flash and/or ram with asm("bkpt 00");.
In the default ARMv7M configuration there are 6 program breakpoints (these catch on address of instruction, fetch), 2 data bus ~patches (these catch on some specific literal, 0xDEADBEEF for example) and 4 watchpoints (these are configurable, can catch on instruction fetch, data r,w,rw, from some range, masked values etc,). The ARMv6M are stripped versions (w.r.t. mentioned resources) and offer reduced functionality and of about half of that.
Your debugger/dongle can be a dumb one or it can be a smartass. Do not blame the uC for that.