当两个引脚配置为具​​有相同的备用功能时,在STM32上会发生什么?


10

通读STM32F051手册,似乎可以在两个引脚上配置相同的备用功能;这似乎是一种可行的方法。例如,您可以同时具有多个USART1_TX引脚。或者例如,两个USART_RX引脚的问题更大。在这种情况下,手册没有任何内容。这合法/安全吗?这有用吗?


2
有趣的问题。我知道为什么有时有时会有用,例如在调试时将TX输出输出到另一个引脚或在一些地方获取缓冲时钟。也许值得添加相关的手册链接,尽管这样可以省去搜索的麻烦。
PeterJ

再次-有趣的问题。但是从两个不同的引脚分配USART_RX的情况如何?希望芯片设计人员为彼此之间计划一个优先方案,而不是允许两个来源进行内部竞争。
Michael Karas 2013年

我从来没有尝试过,但是根据我从引脚图中回想的内容,您基本上将最终在内部将引脚连接在一起。
rjp

Answers:


5

在使用每引脚寄存器选择I / O功能的处理器上,通常可以将输出功能路由到多个引脚而不会发生冲突。所有引脚将回显相同的输出。将多个引脚连接到一个输入的效果通常是不确定的。例如,如果某个UART的I / O引脚3和4连接到UART,则它的行为就好像UART被连接到以3和4引脚作为输入的“与”门一样,或者它的行为就像被连接了一样。到一个引脚,而忽略另一个引脚,或者它可以通过电阻适中的晶体管将两个引脚连接到UART的输入缓冲器,或者当引脚3为高电平和4为低电平时,它可能会吸收额外的电流,反之亦然可能会做任何其他想不到的事情。我不

在Microchip的某些部分(也许还有STM的部分)中使用的一种更好的设计方法是,使每个I / O功能都包括一个多路复用器,以选择应该从哪个引脚接受输入,并让引脚包括一个多路复用器以指示I。 / O函数应从中输出数据。这样的设计使得一个引脚可以提供多个I / O功能,同时消除了冲突配置带来的任何歧义。


3

是的,它很有用。STM32F407VGT6的实验结果:两个AF引脚可以同时用作AF,至少将这些引脚用作AF输入时也可以。实验是在外部触发信号“ TIM1_ETR”的上升沿触发TIM1。可以将“ TIM1_ETR”信号映射到MCU封装的引脚PE7和/或PA12。

实验:将引脚PE7和PA12都初始化为TIM1的AF“ TIM1_ETR”:

{
    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 / 2019年2月8日”生成。


2

基本上,引脚是GPIO,可以分配给备用功能,例如UART_RX。每个备用功能都有其默认引脚和可以将功能重新映射到的备用引脚。如果您在9.1.5节中查阅了STM32F103参考手册,他们会说:

为了针对不同的设备封装优化外围I / O功能的数量,可以将一些备用功能重新映射到其他一些引脚。这可以通过软件对相应的寄存器进行编程(请参阅第177页的AFIO寄存器)来实现。在这种情况下,备用功能不再映射到其原始分配


我的理解是:一旦分配了新的引脚,先前的分配就被删除了,因此从技术上讲,您不能将多个引脚连接到同一外设功能。
dext0rb 2014年

1
这是不可能的,因为(至少在F103上,我还没有使用STM32的其他派生工具),即使不将重映射功能设置为AF_Output,也无法将替代引脚分配给该功能。 GPIO设置。重新映射后,该功能将不再在原始引脚上可用。我希望这可以澄清我的意思。
Manu3l0us 2014年

1
在不同的亚家族中,完成此操作的方式非常不同。F1寄存器结构可能会禁止它,但是F3结构不同,在这种结构中,您将引脚配置为替代功能,而不是将功能配置为引脚,因此似乎可以进行重复映射。实际上,您没有回答所询问问题的情况,该问题似乎与寄存器结构允许的部分有关。
克里斯·斯特拉顿

1
@Chris Stratton STM32F302参考手册第8.3.2节:“设备I / O引脚通过多路复用器连接到板载外设/模块,该多路复用器一次只允许一个外设的备用功能(AF)连接到I / O引脚。这样,同一I / O引脚上可用的外设之间就不会有冲突。” 但是实际上,这并不能说明一个AF上有多个I / O。输入引脚甚至有多个选择?
Manu3l0us 2014年

1
我也很欣赏F1x信息,我也曾经使用过它:-)
joeforker 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.