Some time ago, I wrote a post explaining why a minimal knowledge of bare-metal programming is a must for a modern MCU programmer.
Here is a follow up, showing a minimal example with a cheap, though quite popular hardware setup. The application will show you how to:
prepare the Makefile and linker script with no external dependencies;
write the minimal code to boot the board, set the clock and initialize the UART;
have a loop writing data to UART, once every second.