动态更改输入到输出

Changing Input to Output dynamically

提问人:Cats 提问时间:10/24/2023 最后编辑:user16217248Cats 更新时间:10/25/2023 访问量:53

问:

我使用的是STM32微控制器,我需要将一个引脚从输入更改为输出,然后再更改回输入,以开始与传感器的通信,以便我可以读取数据。

有什么方法可以使用STM32 HAL做到这一点吗?

正确的方法是什么?

C 输入 输出 微控制器

评论


答:

1赞 pmacfarlane 10/24/2023 #1

如果您使用的是 STM 驱动程序,它可以像这样简单:LL

    LL_GPIO_SetPinMode ( MDIO_GPIO_Port, MDIO_Pin, LL_GPIO_MODE_OUTPUT );
    LL_GPIO_SetPinMode ( MDIO_GPIO_Port, MDIO_Pin, LL_GPIO_MODE_INPUT );

如果您只想手动戳位(即没有 LL 驱动程序),您可以查看这些宏/函数的作用。

如果您使用的是 HAL 驱动程序,并且不想自己“弄脏”戳寄存器,则必须考虑以下内容:

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = LCD_CS_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LCD_CS_GPIO_Port, &GPIO_InitStruct);

我认为将 HAL 用于简单的 GPIO 引脚是矫枉过正的,我不建议这样做。

评论

0赞 Cats 10/24/2023
好的,现在我正在使用 HAL 库,因为我需要它来做其他事情。但我不知道有LL驱动程序。我会查一下。谢谢
0赞 pmacfarlane 10/24/2023
如果您在STM32CubeIDE(或者可能是STM32CubeMX)中打开文件,单击顶部的“项目管理器”选项卡,然后单击“高级设置”,您可以选择要用于每个外设的驱动程序。你可以把它混合在一起,把LL用于GPIO和定时器等简单的东西,把HAL用于更复杂的东西,比如I2C。例如。.ioc
2赞 wek 10/24/2023 #2

如果您不使用 Cube/HAL 或 Cube/LL,则只需

#define MDIO_PORT  GPIOB  // MDIO is PB4
#define MDIO_PIN   4      //  -"-

MDIO_PORT->MODER |=  (0b01 << (2 * MDIO_PIN));  // change MDIO from Input to Output
MDIO_PORT->MODER &= ~(0b11 << (2 * MDIO_PIN));  // change MDIO from Output to Input

它比 LL 版本更快,因为它省略了一个额外的不必要的操作。更不用说HAL版本了......

这两个版本都不是原子的,因此当在不同的中断级别中使用相同的GPIOx_MODER寄存器时,必须牢记这一点(除了在 'F1 中,可以通过重写它以使用位带来使其成为原子)。

JW公司

评论

0赞 pmacfarlane 10/24/2023
有趣的是,我们俩都以 MDIO 为例。您需要这样做的少数情况之一。
0赞 wek 10/24/2023
我对此没有任何功劳,我只是想不出任何合理的例子,所以只是拿了你的...... :-)我只记得有一次我需要在输入和输出之间切换,那是由于硬件设计不佳,我无法更改。现在,在自动对焦和输入或输出之间切换更为常见,但那是另一回事了。
0赞 0___________ 10/25/2023
例如,如果您想从模拟模式更改为输出模式,它将不起作用。先清除,再设置
0赞 wek 10/25/2023
从模拟 (0b11) 到输出 (0b01) 它是一个 &,要恢复它,它是一个 |。唯一需要两次操作的时间是在输出和 AF 之间切换。我不确定你说的网是什么意思。