Apa yang terjadi pada STM32 ketika dua pin dikonfigurasikan untuk memiliki fungsi alternatif yang sama?

10

Membaca manual STM32F051, sepertinya memungkinkan untuk mengkonfigurasi fungsi alternatif yang sama pada dua pin; misalnya, Anda dapat memiliki beberapa USART1_TX pin secara bersamaan. Atau misalnya kasus dua pin USART_RX yang lebih bermasalah. Manual diam tentang hal ini. Apakah ini legal / aman? Apakah ini berguna?

joeforker
sumber
2
Pertanyaan menarik. Saya bisa melihat mengapa kadang-kadang akan berguna, misalnya saat debugging untuk mendapatkan output TX ke pin lain atau untuk mendapatkan jam buffer di beberapa tempat. Mungkin ada baiknya menambahkan tautan manual yang relevan untuk menyelamatkan siapa pun yang harus mencarinya.
PeterJ
Lagi - pertanyaan yang menarik. Tetapi bagaimana dengan kasus pemberian USART_RX dari dua pin yang berbeda? Orang akan berharap bahwa perancang chip telah merencanakan skema prioritas untuk satu di atas yang lain sebagai lawan untuk memungkinkan pertikaian internal dari kedua sumber.
Michael Karas
Saya belum pernah mencoba ini, tetapi berdasarkan apa yang saya ingat dari diagram pin, Anda pada dasarnya akan menghubungkan pin bersama-sama secara internal.
rjp

Jawaban:

5

Pada prosesor yang menggunakan register per-pin untuk memilih fungsi I / O, umumnya dimungkinkan untuk merutekan fungsi output ke beberapa pin tanpa konflik; semua pin akan menggemakan output yang sama. Efek dari memiliki beberapa pin yang terhubung ke input sering tidak ditentukan; jika misalnya UART memiliki pin I / O 3 dan 4 yang terhubung ke UART, mungkin berperilaku seolah-olah UART terhubung ke gerbang "AND" yang mengambil pin 3 dan 4 sebagai input, atau mungkin berperilaku seolah-olah terhubung ke satu pin dan mengabaikan yang lain, atau itu mungkin menghubungkan kedua pin ke buffer input UART melalui transistor yang memiliki jumlah resistensi moderat, atau mungkin menarik arus ekstra ketika pin 3 tinggi dan 4 rendah atau sebaliknya, atau itu mungkin melakukan hal lain yang bisa dibayangkan. Saya tidak

Pendekatan desain yang agak lebih bagus, yang digunakan dalam beberapa bagian Microchip (mungkin beberapa bagian STM juga) adalah memiliki setiap fungsi I / O termasuk multiplexer untuk memilih pin mana yang harus menerima input, dan memiliki pin termasuk multiplexer untuk menunjukkan I / O fungsi dari mana ia harus mengeluarkan data. Desain seperti itu memungkinkan untuk memiliki satu pin fungsi ganda I / O feed, sekaligus menghilangkan ambiguitas yang ditimbulkan oleh konfigurasi yang saling bertentangan.

supercat
sumber
3

Ya, ini berguna. Hasil dari percobaan pada STM32F407VGT6: Kedua pin AF dapat digunakan sebagai AF secara bersamaan, setidaknya jika menggunakan pin ini sebagai input AF. Percobaan ini untuk memicu TIM1 pada sisi naik dari pemicu eksternal - sinyal "TIM1_ETR". Sinyal "TIM1_ETR" dapat dipetakan ke pin PE7 dan / atau PA12 paket MCU.

Eksperimen: Inisialisasi kedua pin PE7 dan PA12 sebagai AF "TIM1_ETR" untuk 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
}

Hasilnya - TIM1 dimulai dengan naik ujung pada salah satu pin PE7 atau PA12.

Ini mengungkapkan cara untuk MUX (mengubah) pin AF dalam waktu berjalan:

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

Ini dapat membantu kemudian dua sumber berbeda diperlukan untuk memicu waktu, ini dapat menyelamatkan kita IC MUX offboard :). Kedua input dapat digunakan secara bersamaan, jika diinisialisasi seperti yang ditunjukkan di awal posting. Input tidak terhubung bersama, maksud saya sinyal pada PA12 tidak ditransfer ke PE7 dan sebaliknya (karena GPIO ditetapkan sebagai input).

Kode dihasilkan oleh "STM32CubeF4 v5.3" + "Paket Firmware V1.24.0 / 08-Februari-2019."

Dainius_m
sumber
2

Pada dasarnya, pin adalah GPIO yang dapat ditugaskan ke fungsi alternatif, misalnya UART_RX. Setiap fungsi alternatif memiliki pin default dan pin alternatif yang fungsinya dapat dipetakan kembali. Jika Anda melihat manual referensi STM32F103 di bagian 9.1.5, mereka mengatakan:

Untuk mengoptimalkan jumlah fungsi I / O periferal untuk paket perangkat yang berbeda, dimungkinkan untuk memetakan kembali beberapa fungsi alternatif ke beberapa pin lainnya. Ini dicapai oleh perangkat lunak, dengan memprogram register yang sesuai (lihat register AFIO pada halaman 177). Dalam hal ini, fungsi-fungsi alternatif tidak lagi dipetakan ke tugas aslinya .

Manu3l0us
sumber
Cara saya grok ini adalah: setelah Anda menetapkan pin baru, tugas sebelumnya dihapus, sehingga Anda tidak dapat secara teknis memiliki beberapa pin yang terhubung ke fungsi perangkat yang sama.
dext0rb
1
Itu tidak mungkin, karena (setidaknya pada F103, saya belum bekerja dengan turunan lain dari STM32), pin alternatif tidak dapat ditugaskan ke fungsi tanpa menggunakan fitur remap, bahkan jika Anda mengaturnya sebagai AF_Output di pengaturan GPIO. Dan setelah memetakan kembali, fungsi saya tidak lagi tersedia pada pin asli. Saya harap ini menjelaskan apa yang saya maksud.
Manu3l0us
1
Cara ini dilakukan sangat berbeda pada subfamili yang berbeda. Struktur register F1 mungkin melarangnya, tetapi struktur F3 berbeda, di mana Anda mengonfigurasi pin ke fungsi alternatif alih-alih fungsi ke pin, sehingga pemetaan duplikat tampak mungkin. Akibatnya, Anda tidak menjawab situasi pertanyaan yang diajukan, yang tampaknya merupakan bagian di mana struktur register mengizinkannya.
Chris Stratton
1
@Chris Stratton STM32F302 Ref Manual bagian 8.3.2: "Pin I / O perangkat terhubung ke peripheral / modul melalui multiplexer yang memungkinkan hanya satu fungsi pengganti (AF) satu perangkat yang terhubung ke pin I / O pada suatu waktu. dengan cara ini, tidak ada konflik antara periferal yang tersedia pada pin I / O yang sama. " Tetapi sebenarnya, ini tidak mengatakan apa-apa tentang banyak I / O pada satu AF. Apakah ada beberapa opsi untuk pin input?
Manu3l0us
1
Saya menghargai informasi F1x juga, saya telah menggunakan yang itu juga :-)
joeforker