Из того, что помню наизусть:
1. У GPIO нет нормальных прерываний. Есть дурацкий механизм EXTI или как там его -- ну, кто постоянно работает с STM32, знает, как он точно называется. Он очень ограничен по своим возможностям (нельзя, например, сделать генерацию прерываний по изменению бита 0 порта А и бита 0 порта В -- ему подавай разные биты). У LPC1788 и изрядной части других только у двух портов есть прерывания, зато на каких угодно ногах этих двух портов. У старых Atmelов ещё лучше: там у всех разрядов всех портов прерывания, у почти всех настраивается открытый сток и т.д. и т.п. -- в общем, максимальная гибкость.
2. I2C в STM32 не позволяет сначала прочитать принятый байт и лишь после этого сказать контроллеру, продолжаем мы операцию или завершаемся. У NXPшных процов это делается без проблем, а соответственно, куда больше гибкости при организации обмена.
3. UARTы по-дурному обрабатывают бездействие линии. Обнаруживать сие состояние они обнаруживают, но признак его обнаружения сбрасывается при считывании регистра данных. Поэтому если сложится такая ситуация, что обнаружение бездействия совпало со считыванием последнего полученного байта, обнаружение бездействия будет потеряно. Grindars (мы с ним вместе работаем, но, к моей радости, с STMками приходится мучиться ему) из-за этого кучу времени потратил, пытаясь понять, почему время от времени глючит обмен между STM32L151 и радиочипом.
4. Весьма дурное распределение устройств по ногам, что особенно проявляется при использовании МК в мелких корпусах: часто некуда вывести нужные интерфейсы, зато ног для таймеров выше крыши (а вот самих таймеров иногда не хватает -- отчасти из-за того, что навороченных таймеров у СТМ мало, а примитивных -- много, а лучше б было наоборот). Правда, у NXP тоже не всё гладко в этом плане, причём иногда до идиотизма доходит
5. Примитивный контроллер USB, сваливающий большинство функций на программиста (а не реализующий их в железе, как, например, у NXP).
6. Ну и обилие ошибок в железе. Они у всех имеются, но STMки ставят рекорды по их количеству.
Всё сие усугубляется неважнецкой документацией и отвратительными примерами, библиотеками и прочим -- в последних багов выше крыши, особенно для достаточно сложных устройств (хотя тамошние быдлоиндусы ухитрились, например, поддержку SPI сделать криво -- перепутали где-то |= и &=, похоже, со всеми вытекающими -- это было обнаружено посредством дизассемблирования ихнего кода).