Que se passe-t-il sur le STM32 lorsque deux broches sont configurées pour avoir la même fonction alternative?

10

En lisant le manuel du STM32F051, il semble qu'il soit possible de configurer la même fonction alternative sur deux broches; par exemple, vous pouvez avoir plusieurs broches USART1_TX en même temps. Ou par exemple le cas plus problématique de deux broches USART_RX. Le manuel est muet sur ce cas. Est-ce légal / sûr? Est-ce utile?

joeforker
la source
2
Question interessante. Je peux voir pourquoi cela serait parfois utile, par exemple lors du débogage pour obtenir la sortie TX vers une autre broche ou pour obtenir des horloges tamponnées à quelques endroits. Il pourrait être utile d'ajouter le lien manuel correspondant pour éviter à quiconque de le rechercher.
PeterJ
Encore une fois - Question intéressante. Mais qu'en est-il du cas de l'attribution de USART_RX à partir de deux broches différentes? On pourrait espérer que les concepteurs de puces avaient prévu un schéma de priorité l'un par rapport à l'autre plutôt que de tenir compte des conflits internes des deux sources.
Michael Karas
Je n'ai jamais essayé cela, mais d'après ce que je me souviens des diagrammes de broches, vous finiriez par connecter les broches ensemble en interne.
rjp

Réponses:

5

Sur les processeurs qui utilisent des registres par broche pour sélectionner les fonctions d'E / S, il est généralement possible de router une fonction de sortie vers plusieurs broches sans conflit; toutes les broches feront écho à la même sortie. L'effet d'avoir plusieurs broches connectées à une entrée est souvent non spécifié; par exemple, si un UART avait des broches d'E / S 3 et 4 connectées à un UART, il pourrait se comporter comme si l'UART était connecté à une porte "ET" qui prenait les broches 3 et 4 comme entrées, ou il pouvait se comporter comme s'il était connecté à une broche et ignorer l'autre, ou il pourrait connecter les deux broches au tampon d'entrée de l'UART via des transistors qui avaient une résistance modérée, ou il pourrait tirer un courant supplémentaire lorsque la broche 3 est haute et 4 est faible ou vice versa, ou pourrait faire à peu près tout autre chose imaginable. Je ne '

Une approche de conception un peu plus agréable, utilisée dans certaines parties de micropuce (peut-être aussi certaines parties de STM) consiste à faire en sorte que chaque fonction d'E / S inclue un multiplexeur pour sélectionner la broche dont elle doit accepter l'entrée, et que la broche inclue un multiplexeur pour indiquer le I / O fonction à partir de laquelle il doit sortir des données. Une telle conception permet d'avoir une seule broche pour alimenter plusieurs fonctions d'E / S, tout en éliminant simultanément les ambiguïtés posées par les configurations conflictuelles.

supercat
la source
3

Oui, c'est utile. Résultat de l'expérience sur STM32F407VGT6: Les deux broches AF peuvent être utilisées simultanément comme AF, au moins si vous utilisez ces broches comme entrées AF. L'expérience devait déclencher TIM1 sur le front montant du déclencheur externe - signal "TIM1_ETR". Le signal "TIM1_ETR" peut être mappé aux broches PE7 et / ou PA12 du boîtier MCU.

L'expérience: initialiser les deux broches PE7 et PA12 comme AF "TIM1_ETR" pour 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
}

Le résultat - TIM1 est démarré par front montant sur l'une des broches PE7 ou PA12.

Cela révèle le chemin vers les broches AF MUX (changement) en cours d'exécution:

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

Cela peut être utile, puis deux sources différentes sont nécessaires pour le déclenchement de la minuterie, cela peut nous sauver hors du MUX IC :). Les deux entrées peuvent être utilisées simultanément, si elles sont initialisées comme indiqué au début de l'article. Les entrées ne sont pas connectées ensemble, je veux dire que le signal sur PA12 n'est pas transféré vers PE7 et vice versa (car les GPIO sont définis comme entrées).

Le code est généré par "STM32CubeF4 v5.3" + "Package de micrologiciel V1.24.0 / 08-février-2019".

Dainius_m
la source
2

Fondamentalement, les broches sont des GPIO qui peuvent être attribués à des fonctions alternatives, par exemple UART_RX. Chaque fonction alternative a sa broche par défaut et des broches alternatives auxquelles la fonction peut être remappée. Si vous consultez le manuel de référence du STM32F103 dans la section 9.1.5, ils disent:

Pour optimiser le nombre de fonctions d'E / S périphériques pour différents packages de périphériques, il est possible de remapper certaines fonctions alternatives à d'autres broches. Ceci est réalisé par logiciel, en programmant les registres correspondants (voir Registres AFIO à la page 177. Dans ce cas, les fonctions alternatives ne sont plus mappées à leurs affectations d'origine .

Manu3l0us
la source
Voici la façon dont je réfléchis: une fois que vous avez affecté les nouvelles broches, l'affectation précédente est supprimée, vous ne pouvez donc pas techniquement avoir plusieurs broches connectées à la même fonction périphérique.
dext0rb du
1
Ce n'est pas possible, car (au moins sur le F103, je n'ai pas travaillé avec les autres dérivés du STM32), la broche alternative ne peut pas être affectée à la fonction sans utiliser la fonction de remappage, même si vous la configurez comme AF_Output dans la configuration GPIO. Et après le remappage, la fonction n'est plus disponible sur la broche d'origine. J'espère que cela clarifie ce que je voulais dire.
Manu3l0us
1
La manière de procéder est très différente selon les différentes sous-familles. La structure du registre F1 peut l'interdire, mais la structure F3 est différente, où vous configurez la broche sur une fonction alternative au lieu de la fonction sur une broche, donc des mappages en double semblent possibles. En effet, vous ne répondez pas à la situation de la question posée, qui semble concerner une partie où la structure du registre le permet.
Chris Stratton
1
@Chris Stratton STM32F302 Ref Manual section 8.3.2: "Les broches d'E / S de l'appareil sont connectées à des périphériques / modules intégrés via un multiplexeur qui autorise une seule fonction alternative (AF) d'un périphérique connectée à une broche d'E / S à la fois. de cette façon, il ne peut y avoir de conflit entre les périphériques disponibles sur la même broche d'E / S. " Mais en réalité, cela ne dit rien sur plusieurs E / S sur un AF. Existe-t-il même plusieurs options pour les broches d'entrée?
Manu3l0us
1
J'apprécie également les informations F1x, je les ai également utilisées :-)
joeforker