Простите, если на этот вопрос уже был дан ответ, но я не смог найти ответ ни на этой странице, ни в более широком Интернете.
Я опытный разработчик с приличными знаниями в области низкоуровневого программирования, но относительно новым для встраиваемой разработки. Я учил себя разработке встраиваемых систем с использованием платы ST-NUCLEO144, которая оснащена микроконтроллером STM32F746ZG. Один вопрос, который кажется мне неочевидным, заключается в том, почему логически связанные битовые поля в регистре могут находиться в разных местах.
Одним из примеров является USART_CR1
регистр на STM32746ZG. Эти M0
и M1
битовые поля вместе контролируют длину слова в USART TX / RX, комбинированный 2-битовое значение 0b00
специфицирует 8-бит, 0b01
указывает 9-бит и т.д. Это все довольно просто, за исключением того, что M0
находится на 12 бита и M1
находится на бит 28 ... почему это?
Это связано с устаревшим дизайном, например, новая функция была вставлена в ранее зарезервированное пространство? Я не рассматриваю это по причинам, связанным с дизайном чипа, или я не вижу в этом более важной цели?
Очевидно, что это довольно просто преодолеть с помощью маскировки битов, но мне просто любопытно.
Ответы:
В данном конкретном случае (и в аналогичных случаях, которые я видел) да, это сделано для того, чтобы сохранить обратную совместимость со старыми устройствами и минимизировать любые изменения, необходимые для (возможно, хорошо протестированного и квалифицированного / сертифицированного) кода, уже написанного для этих старых устройств. , Поэтому новые функции и функциональные возможности (требующие новых битов регистров для управления и конфигурации) должны использовать несмежные биты, если смежные биты с исходными битами регистров уже используются.
Например, вот
USART_CR1
регистр старого семейства STM32F1xx.Рисунок 1. Использование регистра STM32F10xxx USART_CR1
Источник изображения: справочное руководство по семейству STM32F10xxx RM0008, раздел 27.6.4
Для более старого USART (только с двумя вариантами длины слова) требуется только один
M
бит для настройки длины слова USART между этими двумя параметрами, и это бит 12. Обратите внимание на то, как также используются биты 11 и 13, и поэтому они недоступны для будущего «расширения» ,Как вы сказали, в более новом STM32F7 (и, например, также в STM32F4) USART теперь имеет 3 варианта длины слова (7, 8 и 9 бит) и поэтому нуждается в другом бите конфигурации - бит 12 есть
M0
, аM1
теперь в бите 28 (ранее зарезервировано в карте регистров STM32F1, как вы видите выше).Рисунок 2. Использование регистра STM32F74xxx USART_CR1
Источник изображения: справочное руководство по семейству STM32F75xxx и STM32F74xxx RM0385, раздел 31.8.1
Они не могли поместить новый
M1
бит в регистровые биты 11 или 13, не перемещая регистровые биты, уже используемые для других функций, и, таким образом, устраняя обратную совместимость с существующим кодом (например, для STM32F1), который их использовал.Поэтому они попытались сохранить некоторую обратную совместимость, что приводит к добавлению новых битов регистра в неожиданных местах.
Поддержание отображения регистров для автономных UART, от 8250 до 16550, с новыми регистрами, добавленными в другом месте в карте регистров, было другим примером.
источник
Вы правы с
Насколько я знаю, сами позиции битов практически не влияют на дизайн (я имею в виду реализацию чипа) в большинстве случаев. Дизайнеры обычно стараются использовать все, что доступно. И в некоторых случаях, например, когда вы пытаетесь увеличить ширину и т. Д.
Тем не менее, есть некоторые случаи, когда позиции битов намеренно держатся далеко друг от друга. В частности, для битов, которые являются критическими и НЕ подлежат изменению непреднамеренными записями (из-за неправильного положения / масок или шифрования в целях безопасности), которые могут привести к тому, что система окажется в нежелательном состоянии.
источник