The STM official core was designed to support as many different STM processors as possible. The way it was done, is to wrap the HAL. That was a good idea, since after the initial effort, new processors are very easy to add, and improvements to the HAL apply to all Arduino wrappers. The HAL itself is a layer of abstraction that permits that versatility, but in doing so, can't always wrap all processor specific functions. If you are developing and you need those, I think the normal way would be to use LL library functions (which are processor specific, AFAIK).
Alternative cores that I used, don't have this problem, but suffer from lack of abstraction of processor type. Thus they are a maintenance headache, and each additional processor required extensive manual adaptations in spite of some very clever factoring and common code.
If you are really serious about developing for that hardware, you will use Cube or some IDE other than Arduino, that supports HAL and LL with example code for each peripheral to get started.
Working elements of the alternative cores were/are nowhere near as well documented as the STM core, in the sense that they boil down to the HAL and LL documentation, which is quite well covered. So, I abandoned them and used the STM Arduino core for general purpose stuff, and Cube IDE for more hardware intensive work.