提问人:Cats 提问时间:10/24/2023 最后编辑:user16217248Cats 更新时间:10/25/2023 访问量:53
动态更改输入到输出
Changing Input to Output dynamically
问:
我使用的是STM32微控制器,我需要将一个引脚从输入更改为输出,然后再更改回输入,以开始与传感器的通信,以便我可以读取数据。
有什么方法可以使用STM32 HAL做到这一点吗?
正确的方法是什么?
答:
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 之间切换。我不确定你说的网是什么意思。
评论