Що відбувається на STM32, коли два штифта налаштовані на однакову альтернативну функцію?


10

Читаючи посібник з STM32F051, схоже, можна настроїти одну і ту ж альтернативну функцію на двох штирях; наприклад, ви можете мати кілька штифтів USART1_TX одночасно. Або, наприклад, більш проблемний випадок двох штифтів USART_RX. Посібник мовчить про цю справу. Це законно / безпечно? Це корисно?


2
Цікаве запитання. Я можу зрозуміти, чому іноді це буде корисно, хоча, наприклад, під час налагодження, щоб отримати вихід TX на інший штифт або отримати буферні годинники в декількох місцях. Можливо, варто додати відповідне посібник, хоча врятувати будь-кого, хто потребує його пошуку.
PeterJ

Знову - цікаве питання. Але як щодо випадку призначення USART_RX з двох різних шпильок? Можна сподіватися, що дизайнери чіпів запланували схему пріоритетності одна для іншої, а не дозволити внутрішні суперечки з двох джерел.
Майкл Карась

Я ніколи цього не пробував, але виходячи з того, що я пам’ятаю з контактних діаграм, ви, в основному, з'єднали шпильки всередині.
rjp

Відповіді:


5

У процесорах, які використовують одноконтактні регістри для вибору функцій вводу / виводу, як правило, можна вивести функцію виводу на кілька штифтів без конфлікту; всі штифти будуть відлунювати однаковий вихід. Ефект підключення до входу декількох штифтів часто не визначений; якщо, наприклад, у UART були штифти 3 і 4 підключення вводу-виводу 3 і 4, підключені до UART, він може вести себе так, ніби UART був підключений до воріт "AND", який приймав штирі 3 і 4 як входи, або він може вести себе так, ніби він був підключений до одного штифта і ігнорувати інший, або він може підключити обидва штифта до вхідного буфера UART через транзистори, які мали помірний опір, або він може привести додатковий струм, коли контакт 3 високий і 4 низький, або навпаки, або він може зробити майже все, що можна уявити. Я не '

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


3

Так, це корисно. Результат експерименту над STM32F407VGT6: обидва штифта автофокусування можуть використовуватися як автофокусування одночасно, принаймні, якщо ці штифти використовувати як входи автофокусування. Експеримент повинен був викликати 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".


2

В основному штифтами є GPIO, які можуть бути призначені для альтернативних функцій, наприклад, UART_RX. У кожної альтернативної функції є штифт за замовчуванням та альтернативні штифти, до яких функція може бути перекомплектована. Якщо ви перегляньте посібник користувача STM32F103 в розділі 9.1.5, вони говорять:

Щоб оптимізувати кількість периферійних функцій вводу / виводу для різних пакетів пристроїв, можна перезаписати деякі альтернативні функції на деякі інші штифти. Це досягається програмним забезпеченням, програмуванням відповідних регістрів (див. Регістри AFIO на стор. 177. У цьому випадку альтернативні функції вже не відображаються на їх початкові призначення .


Те, як я це сприймаю: після призначення нових штифтів попереднє призначення видаляється, тому технічно ви не можете мати кілька штифтів, підключених до однієї периферійної функції.
dext0rb

1
Це неможливо, оскільки (принаймні, на F103, я не працював з іншими похідними STM32), альтернативний контакт не може бути призначений функції без використання функції перенастроювання, навіть якщо ви встановили її як AF_Output в налаштування GPIO. А після перезавантаження, функція i більше не доступна на оригінальному штифті. Сподіваюсь, це пояснює, що я мав на увазі.
Manu3l0us

1
Спосіб цього дуже різний у різних підсемействах. Структура регістра F1 може забороняти її, але структура F3 відрізняється, коли ви налаштовуєте штифт на альтернативну функцію замість функції на штифт, тому дублювання відображень здається можливим. Насправді ви не відповідаєте на ситуацію із заданим питанням, яке, здається, стосується частини, де структура реєстру це дозволяє.
Кріс Страттон

1
Розділ 8.3.2 посібника @Chris Stratton STM32F302 Ref : "Штифти вводу / виводу пристрою підключені до вбудованих периферійних пристроїв / модулів через мультиплексор, який дозволяє лише одну альтернативну функцію периферійного пристрою (AF), підключену одночасно до вводу-виводу. таким чином, не може бути конфлікту між периферійними пристроями, наявними на одному і тому ж штирі вводу / виводу ". Але насправді це нічого не говорить про багаторазове введення-виведення на одній AF. Чи є навіть кілька варіантів вводу штифтів?
Manu3l0us

1
Я також ціную інформацію про F1x, і я також використав цю інформацію :-)
joeforker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.