What a small world! Recently I asked myself the same question. I decided to answer it with a little experiment during my recent vacation: buy a bare micro-controller from DigiKey and get running both a 'blinky' and 'hello world' using only free tools or other ICs that are easily obtainable by anyone. I didn't want to buy any programmers, IDEs, debuggers, or any other pre-made hardware or software. My first step was to build a simple USB to Serial adapter around the FT230XS IC from FTDI. That little board turn out to be extremely useful as it allowed me to load program to to the micro-controllers I tried either using serial boot-loaders or in-system programming via the likes of SPI or JTAG.
My first pick was the LPC824 from NXP. The chip is about $2 and comes with a serial boot-loader that was easy to activate. The LPC824 is only available in surface mount packages, so I soldered it into an adapter to assemble the circuit in a breadboard. The compiler I used is GCC for ARM. I downloaded the latest version of GCC for ARM from
https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads. The serial down-loader I use was lpc21isp downloaded from
https://sourceforge.net/projects/lpc21isp/. There was a problem with the down-loader that prevented downloading to all the memory of the LPC824, but it was easy to fix (SectorTable_8xx[] had only 16 pages defined instead of 32). I found some examples around the net that helped me get started with both 'blinky' and 'hello world'. In all, it took me about 2 days to get the LPC824 going.
My second pick was the STM32F051 from ST . Also around $2 from DigiKey. I soldered the LQFP32 package into an adapter for bread boarding. This processor comes also with a serial boot-loader that is easy to activate. The down-loader I used was FLASHER-STM32 available from
http://www.st.com. The compiler I used was also GCC for ARM that I have already installed for the LPC824. Once again I found examples around the net that allowed me to quickly get 'blinky' and 'hello world' going. This one took me less than a day.
My third pick was the ATmega328 from Atmel (yes the same one in the Arduino board). Around $4 from DigiKey. I used also GCC, which I downloaded from the Atmel page
http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORWINDOWS.aspx. For this one I wrote an ISP programmer using the FT230XS IC configured in bit-bang mode. I got that going fairly quickly, although to be fare I should point out that I just adapted a programmer I wrote for the AT89LP family of micro-controllers from Atmel that have a very similar programing interface to the ATmega328. For the ATmega328 I got both 'blinky' and 'hello world' going in about a day.
My fourth pick was the PIC32MX170F256B from Microchip. Around $5 from Digi-Key. This one was a nightmare! First, there is no freely available GCC compiler you can download, except from Microchip. So I decided to build the compiler from sources. It took me about 3 days to build the compiler, but none of my compiled programs worked out. Finally I gave up and downloaded the free-but-crippled XC32 compiler from Microchip. For my initial tests I used a programmer built around an Arduino board:
https://github.com/ppersia37/ardupic32. The programmer is very slow but it got me started. So after about week I got both 'blinky' and 'hello world' going. I was not happy with the programmer, so I wrote a JTAG programmer around the FT230XS which is orders of magnitude faster than the one built around the Arduino. I don't remember how long it took me to get the programmer done, but for sure it was at least a week (and several bricked PIC32s!). At some point, after some discussions about XC32 in this forum, user 'Karel' posted instructions on how to un-cripple XC32 (
https://www.eevblog.com/forum/microcontrollers/pic32-evolution/msg1007099/#msg1007099) which worked quite well. After what seems a long time I ended up with a nice setup for the PIC32 which I quite like.
My fifth pick was the MSP430, but my vacation was over, so I didn't have time to try it out (reason: see paragraph above!).
So which one is my favorite? All of them! Once I got things going, they were very similar from the programmer's point of view. I like the easiness of both the LPC824 and STM32F051, but the PIC32MX170F256 has a lot more memory and 'feels' powerful (may be I struggled so much with it that I 'appreciate' it more). At some point trying to use printf() (via newlib nano) with the LPC824 I ran out of Flash memory. There are many ways around this problem, so for me is not a deal breaker. Even the Atmega328 felt right despite being an 8-bitter! In the picture below are the bread boarded-micro-controllers, from left to right the AT89LP52 (which I use quite a bit, the Atmega324 programmer is based in the programmer I wrote for this one), LPC824, STM32F051 (with a pot attached, as I also tested the ADC), Atmega328, and PIC32MX170F256.