Всякие библиотеки для работы с девайсами, подключаемыми к микроконтроллерам, в 99% случаев будут привязаны к конкретной архитектуре микроконтроллера и (например в случае с stm32) к конкретной библиотеке, HAL, CMSIS, итд. Хотя само по себе устройство работает по I2C, SPI, GPIO, итд, и от архитектуры микроконтроллера не зависит вообще никак.
Казалось бы, зачем завязываться на конкретную архитектуру? Ну попроси пользователя при инициализации предоставить ссылки на функции i2c_read
и i2c_write
и всё, библиотека моментально становится абсолютно кроссплатформенна, и ее можно элементарно использовать абсолютно где угодно. Но нет. Это слишком сложно, видимо. И в итоге имеем «драйвер такого-то то i2c устройства для ардуины», «драйвер такого-то то i2c устройства для для stm32 с библиотекой HAL», итп.
Я, когда что-то такое сам пишу, всегда стараюсь вынести логику драйвера отдельно, а функции для работы с i2c, gpio, spi - извне предоставлять либе. И в итоге код легко и просто портируется.