shymeet 发表于 2021-9-6 16:16:46

STM32G431CBU6如何设置IO口的方向?

我在使用STM32G431CBU6时,需要使用两个IO口模拟I2C通信,需要像F103系列一样如下设置io口方向:
#define MPU_SDA_IN(){GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=8<<12;}
#define MPU_SDA_OUT() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=3<<12;}

但是出现报错CRL,我顺势查找了stm32g4xx.h文件,与stm32f1xx.h文件对比,发现g确实没有CRL,CRH的寄存器字段,所以不知该如何像F103一样配置IO口方向?
还请各位大佬指教。

废鱼 发表于 2021-9-7 10:45:35

楼主,您好请查阅手册,GPIO寄存器使用GPIOx_BSRR写入1或者0进行输出设置。


另外也可以参考HAL库中对于IO操作的函数:
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_PIN_ACTION(PinState));

if (PinState != GPIO_PIN_RESET)
{
    GPIOx->BSRR = (uint32_t)GPIO_Pin;
}
else
{
    GPIOx->BRR = (uint32_t)GPIO_Pin;
}
}


butterflyspring 发表于 2021-9-7 11:44:28

从手册上看,可以改变寄存器的某些位,如附图所示。 没有直接对应的函数或定义,自己对寄存器操作也行。

butterflyspring 发表于 2021-9-7 11:45:16

butterflyspring 发表于 2021-9-7 11:44
从手册上看,可以改变寄存器的某些位,如附图所示。 没有直接对应的函数或定义,自己对寄存器操作也行。
...

补上附图

xmshao 发表于 2021-9-7 15:15:28

如果不是特别喜好寄存器操作,建议使用Cubemx进行配置。这里涉及到2个寄存器,它们是GPIOx_MODER和GPIOx_OTYPER。至于是否使用内部上下拉电阻,还涉及到GPIOx_PUPDR寄存器,你稍微看看相关内容。

shymeet 发表于 2021-9-8 09:31:25

飞羽一条 发表于 2021-9-7 10:45
楼主,您好请查阅手册,GPIO寄存器使用GPIOx_BSRR写入1或者0进行输出设置。




好的 谢谢指教

至暗时刻 发表于 2021-11-18 15:00:00

![图片.png](data/attachment/forum/202111/18/145732di9oihweo5n1if1a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

![图片.png](data/attachment/forum/202111/18/145859jaafabza9ajl9oqb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")![图片.png](data/attachment/forum/202111/18/145943x6naq0rf4fu4n60r.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

仅供参考
页: [1]
查看完整版本: STM32G431CBU6如何设置IO口的方向?