A ja podzielam zdanie obu panów

Generalnie tendencję do tworzenia programistów oderwanych od sprzętu są. To nic złego, jeśli chodzi o programowanie w systemie. Natomiast jeśli chodzi o programowanie uC, to zazwyczaj jest to ściśle związane ze sprzętem (nie tylko uC) i moim zdaniem oderwać od sprzętu się tego nie da.
Kod tego typu co przedstawił tux jest rzeczywiście beznadziejny, ponieważ nie ma żadnego usprawiedliwienia aby wpisywać do rejestru (czy zmiennej) w taki sposób a tym bardziej, aby sprawdzać flagę w taki sposób.
Od tego są definicje poszczególnych bitów, zawierające ich nazwy. Odszukanie potem w dokumentacji, co było ustawione jest o wiele prostsze. A kompilator i tak to zamieni na to samo.
Co do przenośności kodu. Ja mam takie obserwacje, że przenośność kodu na uC to tylko takie chwytliwe hasełko, mające na celu zachęcić do używania bibliotek. Same biblioteki nie są złe, pod warunkiem, że nie zawierają błędów i używa się je świadomie. Ale tak naprawdę, uC używa się konkretnie pod dane zastosowanie, typowo związane z peryferiami które uC posiada i ze sprzętem towarzyszącym.
Ja z założenia od początku pisałem na rejestrach, ale nie tak radykalnie jak to przedstawił tux. Używam do tego definicji, które do tego zostały stworzone i powodują, że kod jest przejrzysty i czytelny (dla mnie dużo bardziej czytelny niż w przypadku używania bibliotek) i nigdy nie miałem problemów, żeby fragment kodu przenieść na inny uC (oczywiście w ramach rodziny).
Ale wracając do początku,
Jak kiedyś nie było gotowych środowisk do STM32 tak teraz mamy ich nadmiar, między innymi CUBE. Jest to dobrodziejstwo ale i przekleństwo, ponieważ tworzy z programisty klikacza. Zamiast zaglądnąć do manuala i ustawić kilka rejestrów, wyklikuje konfogurację i w gruncie rzeczy nie ma pojęcia jak i co ustawił. Następnie przechodzi do pisania programu traktując sprzęt jak abstrakcję. Wszystko fajnie, dopóki działa. Ale jak pojawiają się problemy, coś nie działa, pewne zależności to taki programista/kilkacz nie umie sobie z tym poradzić, przecież wyklikał wszystko dobrze.
Dlatego moim zdanie, tworzenie warstwy abstrakcyjnej-owszem ale na oprogramowaniu, gdzie program to w większości algorytmy oderwane od sprzętu. Natomiast jeśli tworzy się program który bezpośrednio steruje sprzętem, moim zdaniem im poziom niższy tym kontrola i przewidywalność większa.