start with one of these boards
https://www.st.com/en/evaluation-tools/ ... 401re.html
https://www.st.com/en/evaluation-tools/ ... 411re.html
the Nucleo's have the st-link built-in you don't need another st-link for that
Nucleos are ST originals
Adafruit has one slightly pricy but fast and has lots of flash and sram and lots of on chip peripherals
https://www.adafruit.com/product/4382
and adafruit has complete tutorials
https://learn.adafruit.com/adafruit-stm ... er-express
but that if you are based in the americas, canada and even europe etc this could be cheaper for shipping
then for the cost conscious, try one from weact
https://github.com/WeActStudio/WeActStu ... iSTM32F4x1
https://www.aliexpress.com/item/1005001456186625.html
Weact carries quite a number of different stm32 boards including the new g4 and h5 and stm32wb boards.
https://weactstudio.aliexpress.com/store/910567080
but the stm32f4x1 is recommended because it is quite likely it works with stm core directly out of the box
https://github.com/stm32duino/Arduino_Core_STM32/wiki
the stm32f4xx series also can normally be programmed with just a normal (phone) usb cable, no st-link required.
smaller stm32f103 soc normally has 20k sram and like 64k flash, it is normally enough to 'blink a led', but if you try to pack lots of things e.g. + tft lcd lilbrary + sensors + rtos, you would quickly run out of memory. And you need st-link just to program it
while the stm32f4xx family normally are shipped with more ram (e.g. 32k, 64k etc) and flash (128k, 256k etc), runs (much) faster (has fpu and 'ART' accelerator) and makes for a much painless start, you can literally install *fat* binaries e.g. including like micropython and they 'just works'
don't use the internal (HSI) oscillator, especially if you intended to use usb as well.
external crystal oscillator (HSE) is normally required to reach the advertised speeds and a good and accurate crystal is normally more stable, precise and accurate vs HSI (internal) oscillator.
to use HSI, one 'simple' way in fact is to use an empty SystemClock_Config() or simply return from there.