The actual problem with STM32 libraries is that they do not provide any encapsulation or abstraction whatsoever - so you just need to somehow "know" each and every bit and piece you need to do to initialize a device. And in addition, you need to know how to handle the library overhead, which is typically around 1000%.
So what you end up with is either of these two:
1) you copypaste other's code
2) you use an autogeneration tool
At this point, you could have just as well copypasted (or autogenerated) a more compact, robust, and readable code without the extra overhead from the "library".
And guess what, after copypasting readable, meaningful, compact and efficient code for a few times, you start learning, and need less copypasting in the future.
The complex library also gives the false impression that everything underneath must be "super complex". For example, the STM32 ADCs are far from super complex - initializing it properly is around 5-6 lines of code, no big catches, nothing strange going on - only a few more operations than on a comparable AVR (around 3 lines). Sure, when you do it through the library, it's so many lines (typ. 20-30), full of long names, that the only way around is copypasting or autogenerating.
In fact, looking at the ADC initialization code now, it's not much different from the AVR ADC at all. The only "extras" are that you need to enable the ADC from the RCC registers first, and change the input pin to analog mode ("11" in MODER bits, similar to DDR in AVR, but two bits per pin because of more functionality). Then you need to set the ADC prescaler, channel(s) you want to convert, enable the ADC and give a start trigger, just like in AVR. If you want DMA, it's 7 lines of initialization more, but saves it back elsewhere since you don't need interrupts nor polling at all, often not any kind of ADC control code after the init!
A proper library would have an usable interface and would deal with register-level stuff internally. In STM32, they mostly wrap each and every register operation for you to make inefficiently.
The solution is simple: don't use those libraries. The "AVR-like" traditional access is, in almost all cases:
1) definitely easier than using the libraries, by an order of magnitude
2) easy enough that you can stop resorting to copypasting/autogenerating after gaining a bit of experience (100% impossible to do with the libraries - even if you actually learned each character needed by heart, just typing everything out would take too long!)
If you need complex network or USB filesystem stacks, etc., that would be different.