Ja tut es. Während alle Cortex M-Controller denselben Kern und einige der Kernperipheriegeräte gemeinsam nutzen, sind alle anderen Peripheriegeräte herstellerspezifisch.
Selbst die Verwendung von CMSIS hilft Ihnen in diesem Szenario nicht viel, da es nur Dinge abdeckt, die von ARM bereitgestellt werden, dem Kern und den Kernperipheriegeräten (NVIC, Systick ...).
Wenn Sie also von einem Anbieter zu einem anderen wechseln, müssen Sie am Ende das Datenblatt, das Referenz- (oder Benutzer-) Handbuch lesen und herausfinden, wie das Zeug funktioniert. Sie müssen nicht unbedingt alle Registernamen lernen, da Anbieter jetzt Peripheriebibliotheken bereitstellen, die eine abstrakte Ebene auf die Hardware legen.
Aber es ist nicht schwer oder herausfordernd, es ist das, was Sie tun müssen - ich würde sagen, es ist sogar einer der spaßigeren Teile, um herauszufinden, wie diese Peripheriegeräte funktionieren.
Und nachdem Sie dies erkannt haben, möchten Sie möglicherweise eine Hardware-Abstraktionsschicht schreiben, um zu verhindern, dass Ihre Firmware für einen anderen Controller vollständig unbrauchbar wird. Wenn Sie eine stabile HAL haben, können Sie zumindest die Gerätetreiber und Anwendungsebenen auf Ihren nächsten Controller übertragen und müssen die HAL nur erneut implementieren.
Obwohl die Anbieter Peripheriebibliotheken anbieten, die als HAL fungieren, gibt es keinen Anbieterübergreifenden Standard. Auf der untersten Ebene müssen Sie also Ihre Software anpassen, weshalb ich sagte, dass Sie möglicherweise selbst eine HAL schreiben möchten (in der Sie die HAL des Anbieters verwenden können).
Wenn Sie eine stabile HAL implementieren möchten, sind Ihre Funktionen höchstwahrscheinlich auf die grundlegenden Funktionen der allgemeinen Peripheriegeräte beschränkt, sodass jeder Controller abstrahiert werden kann. In der Regel verlieren Sie einige erweiterte Funktionen der Peripheriegeräte, da diese nicht überall verfügbar sind (z. B. ein Baudratenerkennungsmechanismus oder eine automatische Totzeit zwischen PWM-Kanälen). Das ist der Preis, den man zahlen muss. Wenn wir diese Mechanismen für unsere Anwendung benötigen, schreiben wir zu diesem Zweck einen speziellen Hardwaretreiber, damit der Rest weiterhin mit der gemeinsamen HAL arbeiten kann.
Mit diesem Ansatz habe ich eine Anwendung auf zwei andere Mikrocontroller portiert, die gerade die HAL implementiert haben. Der Rest konnte ohne eine einzige Änderung in der Software kompiliert werden.