ST's HAL isn't useful, at all, IMHO.
A genuinely useful vendor library provides at least one of two things:
- compatibility between related (but different) components, to ease code portability
and/or
- a level of abstraction which allows useful objectives to be specified without having to delve into the underlying register map
ST doesn't achieve this. Code written for one processor doesn't run without substantial modification on other parts. Worse still is that the parameters which have to be supplied to the HAL functions closely mirror the register map, so it's really just obfuscating the underlying hardware accesses. I'm afraid I don't agree with you that the HAL library is at a high abstraction level.
Some parts can be useful. You'll need the per-device header files which define the register map, and you can extract these from the projects created by STM32 CubeMX. The auto-generated code to set up the CPU's clock source and PLLs might be useful, though I still elect to replace it with my own code.