Что нужно знать для программирования железа?
Вообще, если вы хотите быть именно программистом, то знание как паять и деталей схемотехники не нужны. Обычно в более менее приличных конторах разделяют схемотехника и программиста. Но в небольших конторах, это может совмещаться, однако это сильно влияет на качество.
Поэтому если вы хотите быть специалистом высокого класса, то лучше разделить две эти вещи, схемотехника и программирование. 
В целом программирования для микроконтроллеров можно как и любую другую разработку разделить на уровни.
Для простоты скажем это Уровень железа (Hardware Abstact Level (HAL)) и уровень приложения (Application или Business Level)
Для того, чтобы заниматься уровнем железа необходимо: В первую очередь знать как работает микроконтроллер, и всякая периферия от простых портов, UART, ADC, SPI и до USB, Ethernet и Bluetooth. Для этого необходимо почитать соответствующую литературу, можно статьи, коих много в интернете.  
И после этого ознакомления, самое главное, необходимо изучить оригинальные спецификации на все это, потому что только там есть правда.Необходимо знать язык программирования, для начала Си, но лучше сразу начать с С++ :). Ассемблер вам понадобиться в настоящих приложениях очень редко, только если, вы скажем, захотите написать свою RTOS . Т.е. особо без надобности изучать ассемблер не надо, но как работает ПО прошитое в микроконтроллер и сам микроконтроллер вы знать должны (Стек, как происходит вызов функций, как выполняется прерывание, как создаются динамические объекты, что такое куча и т.д.) 
Для того, чтобы заниматься уровнем приложения:  строго говоря можно про аппаратуру знать постольку поскольку, например, если у вас уже написал HAL для UART, то вам не надо знать, какие там регистры используются для установки четности или скорости, вы просто будете вызывать соответствующие функции  HAL однако тут необходимо знать дополнительно много всего, включая С++ и, например, паттерны проектирования, Операционные системы реального времени, парадигмы программирования ( к примеру, ООП, метапрограммирование) и т.д. 
В общем и целом, если контора небольшая то, для "программирования железа" необходимо уметь все от разработки схем и оптимизации кода на ассемблере до Метапрограммирования... Таких людей в жизни я не видел. Есть люди которые знают это все, но знания очень поверхностные, есть которые хорошо знают одну часть, но не очень другую.
Обычно все таки людей разделяют на схемотехника и программиста, который делает все от HAL до бизнес логики.
В идеале, должны быть 3 человека, схемотехник, программист низкого уровня (HAL, стеки, драйвера), программист бизнес логики
Это зависит от проекта. Там ещё и осциллограф нужен.