STM32 gotchas
1. Peripheral clock must be enabled in RCC

This is a common feature for all 32-bitters - to control consumption, clocks to most peripherals are gated and have to be enabled individually.

In STM32, this happens in the RCC module (RCC does not have a clock gate so is available all the time). The vast majority of modules' clock is disabled after reset, see the individual RCC_AHBxENR/RCC_APBxENR registers' description in the respective Reference Manual (RM).

Using a module without enabling its clock, is a quite common mistake when programming STM32. However, it can be easily detected when debugging: if a module's clock is not enabled, all of its registers read as zero (and of course can't be written).