当两个引脚配置为具​​有相同的替代功能时,STM32 上会发生什么情况?

电器工程 stm32 GPIO
2022-01-12 08:41:55

通读 STM32F051 手册,似乎可以在两个引脚上配置相同的复用功能;例如,您可以同时拥有多个 USART1_TX 引脚。或者例如两个 USART_RX 引脚的问题更大的情况。手册对这种情况保持沉默。这合法/安全吗?这有用吗?

3个回答

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

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

是的,它很有用。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 / 08-February-2019”生成。

基本上,这些引脚是 GPIO,可以分配给其他功能,例如 UART_RX。每个替代功能都有其默认引脚和可以重新映射该功能的替代引脚。如果您查看第 9.1.5 节中的 STM32F103 参考手册,他们会说:

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