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