Что происходит на STM32, когда два контакта настроены на одну и ту же альтернативную функцию?

10

Читая руководство по STM32F051, похоже, можно настроить одну и ту же альтернативную функцию на двух контактах; Например, вы можете использовать несколько выводов USART1_TX одновременно. Или, например, более проблемный случай с двумя выводами USART_RX. В руководстве об этом случае ничего не сказано. Это законно / безопасно? Это полезно?

joeforker
источник
2
Интересный вопрос. Я могу понять, почему иногда это может быть полезно, например, при отладке, чтобы получить вывод TX на другой вывод или получить буферизованные часы в нескольких местах. Хотя, возможно, стоит добавить в соответствующую ссылку руководство, чтобы спасти любого, кто ищет его.
PeterJ
Опять же - интересный вопрос. Но как насчет назначения USART_RX из двух разных выводов? Можно было бы надеяться, что разработчики микросхем запланировали схему приоритетов один над другим, а не внутренние конфликты из двух источников.
Майкл Карас
Я никогда не пробовал этого, но, основываясь на том, что я помню из диаграмм контактов, вы бы в итоге соединили контакты внутри.
2013 года

Ответы:

5

На процессорах, которые используют индивидуальные регистры для выбора функций ввода / вывода, обычно можно направить функцию вывода на несколько контактов без конфликта; все выводы будут отображаться одинаково. Эффект наличия нескольких выводов, подключенных к входу, часто не определен; если, например, UART имеет контакты 3 и 4 ввода / вывода, подключенные к UART, он может вести себя так, как если бы UART был подключен к вентилю «И», который принимает контакты 3 и 4 в качестве входов, или он мог бы вести себя так, как если бы он был подключен к одному контакту и игнорируют другой, или он может соединить оба контакта с входным буфером UART через транзисторы с умеренным сопротивлением, или он может потреблять дополнительный ток, когда контакт 3 высокий, а 4 низкий или наоборот, или он может сделать что-нибудь еще вообразить. Я не

Несколько более приятный подход к проектированию, используемый в некоторых частях микрочипа (возможно, также в некоторых частях STM), состоит в том, чтобы каждая функция ввода-вывода включала мультиплексор для выбора, с какого вывода он должен принимать вход, и чтобы вывод включал мультиплексор для индикации I Функция / O, из которой он должен выводить данные. Такая конструкция позволяет иметь один вывод для нескольких функций ввода / вывода, одновременно устраняя любые неопределенности, возникающие из-за конфликтующих конфигураций.

Supercat
источник
3

Да, это полезно. Результат эксперимента на STM32F407VGT6: Оба контакта AF могут использоваться одновременно в качестве AF, по крайней мере, если эти контакты используются в качестве входов AF. Эксперимент состоял в том, чтобы запустить TIM1 по переднему фронту внешнего триггера - сигнала «TIM1_ETR». Сигнал «TIM1_ETR» может быть отображен на контакты PE7 и / или PA12 пакета MCU.

Эксперимент: Инициализируйте оба контакта PE7 и PA12 как AF "TIM1_ETR" для TIM1:

{
    GPIO_InitTypeDef GPIO_InitStruct = { 0 };
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pin = GPIO_PIN_7;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // configure PE7 as AF

    GPIO_InitStruct.Pin = GPIO_PIN_12;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // configure PA12 as AF
}

Результат - TIM1 запускается по переднему фронту на любом из контактов PE7 или PA12.

Это показывает путь к MUX (изменить) контактам AF во время выполнения:

main
{
  GPIO_InitTypeDef GPIO_InitStruct = { 0 };

// Deactivate PA12 input (set as regular input):
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pin = GPIO_PIN_12;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// select PE7 as a trigger source,
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pin = GPIO_PIN_7;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

// Arm the timer
    arm_tim1();

/* Now timer will be started by rising edge only on PE7 */

// ... later one can select PA12 as trigger source. Deactivate PE7 (set as regular input):
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pin = GPIO_PIN_7;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

// Activate PA12
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pin = GPIO_PIN_12;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// Arm the timer
    arm_tim1();
/* timer will be started by rising edge only on PA12 */
}

Это может быть полезно, тогда для запуска таймера нужны два разных источника, это может спасти нас от MUX IC :). Оба входа могут использоваться одновременно, если они инициализированы, как показано в начале сообщения. Входы не соединены вместе, я имею в виду, что сигнал на PA12 не передается на PE7 и наоборот (потому что GPIO устанавливаются как входы).

Код генерируется «STM32CubeF4 v5.3» + «Пакет прошивок V1.24.0 / 08-Февраль-2019».

Dainius_m
источник
2

По сути, это контакты GPIO, которые могут быть назначены альтернативным функциям, например, UART_RX. Каждая альтернативная функция имеет свой вывод по умолчанию и альтернативные выводы, на которые можно переназначить функцию. Если вы посмотрите справочное руководство по STM32F103 в разделе 9.1.5, они скажут:

Чтобы оптимизировать количество периферийных функций ввода / вывода для различных пакетов устройств, можно переназначить некоторые альтернативные функции на некоторые другие контакты. Это достигается с помощью программного обеспечения, путем программирования соответствующих регистров (см. Регистры AFIO на стр. 177. В этом случае альтернативные функции больше не сопоставляются с их первоначальными назначениями .

Manu3l0us
источник
Вот как я это понимаю: когда вы назначаете новые контакты, предыдущее назначение удаляется, поэтому технически невозможно подключить несколько контактов к одной периферийной функции.
dext0rb
1
Это невозможно, потому что (по крайней мере на F103 я не работал с другими производными STM32), альтернативный вывод не может быть назначен функции без использования функции переназначения, даже если вы настроили его как AF_Output в настройка GPIO. И после переназначения функция i больше не доступна на исходном выводе. Я надеюсь, что это проясняет, что я имел в виду.
Manu3l0us
1
То, как это делается, сильно отличается в разных подсемействах. Структура регистра F1 может запрещать это, но структура F3 отличается, где вы конфигурируете контакт для альтернативной функции вместо функции для контакта, так что дублированные отображения кажутся возможными. По сути, вы не отвечаете на ситуацию задаваемого вопроса, которая, по-видимому, относится к той части, где структура регистра позволяет это делать.
Крис Страттон
1
@Chris Stratton STM32F302 Справочный раздел, раздел 8.3.2: « Контакты устройства ввода-вывода подключены к встроенным периферийным устройствам / модулям через мультиплексор, который допускает одновременное подключение только одной функции периферийного устройства (AF) к выводу ввода-вывода. В таким образом, не может быть конфликта между периферийными устройствами, имеющимися на одном выводе ввода-вывода ». Но на самом деле, это ничего не говорит о множественных ввода-вывода на одном AF. Есть ли несколько вариантов входных контактов?
Manu3l0us
1
Я также ценю информацию о F1x, я тоже использовал ее :-)
joeforker