Это в значительной степени основано на мнении, и я не удивлюсь, если этот вопрос будет закрыт по этой причине. Этот ответ затрагивает лишь несколько аспектов того, о чем вы спрашиваете. Это очень широкая тема, и будет сложно - если не невозможно - включить все в один пост, который не будет занимать несколько страниц. Однако, чтобы дать вам мой взгляд на эту тему, пытаясь оставаться непредвзятым, краткий ответ ... это зависит.
Если вы спрашиваете о том, что используется в большинстве распространенных случаев, скорее всего, это будут функции HAL (ранее StdPeriph), о которых вы упоминали. Причина в том, что они выполняют свою работу в большинстве обычных случаев. В конце концов, все сводится к тому, какова будет стоимость создания продукта. Если функции HAL «достаточно хороши» для этой цели, они будут использоваться просто потому, что они быстрее развиваются. Чем выше стоимость разработки, тем больше вы захотите сократить ее (или переместить в другое место), и использование абстракций - один из способов сделать это.
Однако, хотя я думаю, что можно с уверенностью предположить, что HAL / Std Periph / любой другой (включая проприетарный) уровень абстракции обычно используется, это не всегда случай по крайней мере по двум причинам, которые я могу себе представить из:
Существующие функции могут не подходить для вашей цели. Приведя в качестве примера HAL, он работает довольно хорошо для большинства распространенных случаев, но иногда ваши потребности могут быть настолько специфичными, что вам придется пойти и покопаться «под капотом», часто заканчивая тем, что вы пишете свой собственный вариант функций строить что-то новое на вершине HAL. Лично я могу вспомнить хотя бы несколько примеров, когда функции HAL были не совсем тем, что мне нужно. Это не обязательно означает, что библиотека плохая, просто иногда требования очень специфичны.
Из-за производительности иногда может потребоваться непосредственное взаимодействие с регистрами. HAL и подобные являются уровнем абстракции и, как и любая абстракция, для их выполнения требуется больше времени, чем для непосредственного использования регистров. Если вы пытаетесь выжать абсолютный максимум из заданного периферийного устройства, вам иногда придется понизиться до уровня регистрации.
Теперь к более пристрастной части моего ответа ... Я понимаю, почему вы задаете этот вопрос. Исходя из мира PIC, где тактовые частоты флэш-памяти или процессора были более ценными, имеет смысл использовать регистры непосредственно там. В случае STM32 это уже не так критично. Сказав это, вы иногда будете сталкиваться с мнением о том, что «использование регистров - единственный верный путь», но лично я считаю, что такие дискуссии заканчиваются чисто академическими. Я вижу регистры или любые абстракции, построенные на них, как инструменты, и вы должны использовать правильные инструменты для правильной работы. Два примера НЕ с использованием правильных инструментов:
Вы используете только регистры как «единственный правильный путь», либо потому, что вы сами в это верите, либо вам так сказали. Ваши продукты занимают в два раза больше времени (если не больше), ваш код занимает меньше места во флэш-памяти (так что теперь вы используете 46% флэш-памяти 1 МБ вместо 48%). Код, критичный к производительности, отвечает его целям. Код, который ослабил временные ограничения на выполнение, также очень эффективен, но он не сильно влияет на конечного пользователя, если он вообще существует. Ваш код также менее пригоден для повторного использования - каждый раз, когда вы выпускаете новый продукт для нового семейства MCU, вы переписываете одни и те же части кода снова и снова.
Вы используете HAL / любую другую подобную абстракцию только потому, что «вы не выбрали такой мощный MCU, чтобы опускаться до уровня регистрации» или потому, что вам сказали, что вы никогда не должны касаться регистров.Вы разрабатываете намного быстрее, и вы можете выпустить два продукта вместо одного, используя регистры.Однако, когда есть ограничения по времени выполнения / скорости передачи, на которые вы должны попасть, вы обнаружите, что выбираете микроконтроллеры более мощные, чем теоретически необходимо.Иногда вы обнаруживаете, что пишете обертки вокруг HAL, потому что они не дают вам именно ту функциональность, которая вам нужна - кажется, что сделать ее сложнее, чем следует.
Так что, в конце концов, еслия хотел сказать, что вы должны использовать то, что подходит для работы в каждом конкретном случае.В случае STM32 у вас в настоящее время есть 3 варианта: HAL (верхний уровень абстракции), HAL LL (низкоуровневая абстракция - часто допускаются простые функции-оболочки вокруг регистра) или непосредственное использование регистров.Какой из них вы выберете, должен соответствовать вашим требованиям.