通读STM32F051手册,似乎可以在两个引脚上配置相同的备用功能;这似乎是一种可行的方法。例如,您可以同时具有多个USART1_TX引脚。或者例如,两个USART_RX引脚的问题更大。在这种情况下,手册没有任何内容。这合法/安全吗?这有用吗?
通读STM32F051手册,似乎可以在两个引脚上配置相同的备用功能;这似乎是一种可行的方法。例如,您可以同时具有多个USART1_TX引脚。或者例如,两个USART_RX引脚的问题更大。在这种情况下,手册没有任何内容。这合法/安全吗?这有用吗?
Answers:
在使用每引脚寄存器选择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 / 2019年2月8日”生成。
基本上,引脚是GPIO,可以分配给备用功能,例如UART_RX。每个备用功能都有其默认引脚和可以将功能重新映射到的备用引脚。如果您在9.1.5节中查阅了STM32F103的参考手册,他们会说:
为了针对不同的设备封装优化外围I / O功能的数量,可以将一些备用功能重新映射到其他一些引脚。这可以通过软件对相应的寄存器进行编程(请参阅第177页的AFIO寄存器)来实现。在这种情况下,备用功能不再映射到其原始分配。