Co dzieje się na STM32, gdy dwa piny są skonfigurowane tak, aby miały tę samą funkcję alternatywną?

10

Czytając instrukcję STM32F051, wygląda na to, że można skonfigurować tę samą funkcję alternatywną na dwóch pinach; na przykład możesz mieć wiele pinów USART1_TX jednocześnie. Lub na przykład bardziej problematyczny przypadek dwóch pinów USART_RX. W tym przypadku instrukcja milczy. Czy to jest legalne / bezpieczne? Czy to jest przydatne?

współpracownik
źródło
2
Interesujące pytanie. Rozumiem, dlaczego czasami jest to przydatne, na przykład podczas debugowania, aby przenieść wyjście TX na inny pin lub uzyskać buforowane zegary w kilku miejscach. Warto jednak dodać odpowiedni link do instrukcji, aby oszczędzić każdemu, kto będzie go szukał.
PeterJ
Znowu - ciekawe pytanie. Ale co z przypadkiem przypisania USART_RX z dwóch różnych pinów? Można mieć nadzieję, że projektanci czipów zaplanowali schemat priorytetowy dla jednego nad drugim, w przeciwieństwie do umożliwienia wewnętrznej rywalizacji z dwóch źródeł.
Michael Karas
Nigdy tego nie próbowałem, ale w oparciu o to, co pamiętam ze schematów pinów, w zasadzie skończyłbyś łączeniem pinów wewnętrznie.
rjp

Odpowiedzi:

5

W procesorach, które używają rejestrów na pin do wybierania funkcji I / O, ogólnie możliwe jest kierowanie funkcji wyjścia do wielu pinów bez konfliktu; wszystkie piny wygenerują echo tego samego wyjścia. Efekt posiadania wielu pinów podłączonych do wejścia jest często nieokreślony; jeśli np. UART miałby piny 3 i 4 I / O podłączone do UART, może zachowywać się tak, jakby UART był podłączony do bramki „AND”, która przyjmowała piny 3 i 4 jako wejścia, lub może zachowywać się tak, jakby był podłączony do jednego pinu i zignoruj ​​drugi, albo może połączyć oba piny z buforem wejściowym UART poprzez tranzystory o umiarkowanej rezystancji lub może pobierać dodatkowy prąd, gdy pin 3 jest wysoki i 4 jest niski lub odwrotnie, lub może zrobić wszystko, co tylko można sobie wyobrazić. Ja nie

Nieco ładniejszym podejściem projektowym, stosowanym w niektórych częściach Microchip (być może także w niektórych częściach STM) jest posiadanie każdej funkcji we / wy zawierającej multiplekser do wybierania, z którego styku powinien przyjmować sygnał wejściowy, i styk zawierający multiplekser wskazujący I Funkcja / O, z której powinna wyprowadzać dane. Taki projekt umożliwia, aby jeden pin podawał wiele funkcji We / Wy, jednocześnie eliminując wszelkie niejasności wynikające z konfliktowych konfiguracji.

supercat
źródło
3

Tak, jest to przydatne. Wynik eksperymentu na STM32F407VGT6: Oba piny AF mogą być używane jednocześnie jako AF, przynajmniej jeśli te piny są używane jako wejścia AF. Eksperyment polegał na wyzwoleniu TIM1 na zboczu narastającym zewnętrznego wyzwalacza - sygnał „TIM1_ETR”. Sygnał „TIM1_ETR” może być mapowany na piny PE7 i / lub PA12 pakietu MCU.

Eksperyment: Zainicjuj oba piny PE7 i PA12 jako AF „TIM1_ETR” dla 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
}

Wynik - TIM1 jest uruchamiany przez zbocze narastające na dowolnym z pinów PE7 lub PA12.

Ujawnia to drogę do pinów MUX (zmiana) AF w czasie wykonywania:

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 */
}

Może to być pomocne, ponieważ do uruchomienia timera potrzebne są dwa różne źródła, co może uratować nas poza MUX IC :). Oba wejścia mogą być używane jednocześnie, jeśli są inicjalizowane, jak pokazano na początku postu. Wejścia nie są ze sobą połączone, to znaczy sygnał na PA12 nie jest przesyłany do PE7 i odwrotnie (ponieważ GPIO są ustawione jako wejścia).

Kod jest generowany przez „STM32CubeF4 v5.3” + „Pakiet oprogramowania układowego V1.24.0 / 08-luty-2019”.

Dainius_m
źródło
2

Zasadniczo piny to GPIO, które można przypisać do alternatywnych funkcji, np. UART_RX. Każda funkcja alternatywna ma swój pin domyślny i piny alternatywne, do których można przypisać funkcję. Jeśli zapoznasz się z instrukcją obsługi STM32F103 w sekcji 9.1.5, powiedzą:

Aby zoptymalizować liczbę peryferyjnych funkcji We / Wy dla różnych pakietów urządzeń, możliwe jest ponowne przypisanie niektórych funkcji alternatywnych do niektórych innych styków. Osiąga się to poprzez oprogramowanie, programując odpowiednie rejestry (patrz rejestry AFIO na stronie 177. W takim przypadku alternatywne funkcje nie są już mapowane do ich pierwotnych przypisań .

Manu3l0us
źródło
Przytaczam: po przypisaniu nowych pinów poprzednie przypisanie jest usuwane, więc technicznie nie można podłączyć wielu pinów do tej samej funkcji peryferyjnej.
dext0rb
1
Nie jest to możliwe, ponieważ (przynajmniej na F103 nie pracowałem z innymi pochodnymi STM32), alternatywnego pinu nie można przypisać do funkcji bez użycia funkcji zmiany przypisania, nawet jeśli ustawisz go jako AF_Output w konfiguracja GPIO. Po ponownym przypisaniu funkcja nie jest już dostępna na oryginalnym pinie. Mam nadzieję, że to wyjaśnia, co miałem na myśli.
Manu3l0us
1
Sposób ten jest bardzo różny w różnych podrodzinach. Struktura rejestru F1 może tego zabronić, ale struktura F3 jest inna, w której konfigurujesz pin do funkcji alternatywnej zamiast funkcji do pina, więc zduplikowane mapowania wydają się możliwe. W efekcie nie odpowiadasz na sytuację zadanego pytania, które wydaje się dotyczyć części, w której zezwala na to struktura rejestru.
Chris Stratton
1
@Chris Stratton STM32F302 Ref Instrukcja rozdział 8.3.2: „Piny we / wy urządzenia są podłączone do urządzeń peryferyjnych / modułów za pośrednictwem multipleksera, który pozwala tylko na jedną alternatywną funkcję urządzenia peryferyjnego (AF) podłączoną jednocześnie do pinu we / wy. W w ten sposób nie będzie konfliktu między urządzeniami peryferyjnymi dostępnymi na tym samym pinie we / wy. ” Ale tak naprawdę nie mówi to nic o wielu I / O na jednym AF. Czy jest jeszcze wiele opcji dla pinów wejściowych?
Manu3l0us
1
Doceniam także informacje F1x, też z nich skorzystałem :-)
joeforker