本帖最后由 Afanx 于 2023-1-3 15:10 编辑
N32MCU各系列的GPIO模块,N32G45x系列相较其他系列存在较大的差异。 本贴介绍N32G45x系列的GPIO配置,其他系列参考 : GPIO模块配置(二)【除N32G45x外其他系列】https://bbs.21ic.com/icview-3276040-1-1.html
一、使能GPIO时钟 开启对应IO的时钟 RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
如果作为外设的复用IO,需要开启AFIO时钟 RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO , ENABLE);
二、配置GPIO模式 1、声明并初始化GPIO结构体变量 GPIO_InitType GPIO_InitStructure;
GPIO_InitStruct(&GPIO_InitStructure);
2、修改结构体变量参数 GPIO_InitStructure.Pin = GPIO_PIN_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
3、初始化GPIO GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
N32G45x系列GPIO初始化配置只需要GPIO_Mode和GPIO_Speed参数。 其中GPIO Mode可配的参数如下(8种模式): 模拟输入 普通输入(浮空、上拉、下拉) 普通输出(推挽、开漏) 复用输出(推挽、开漏) typedef enum
{
GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18
} GPIO_ModeType;
其中GPIO_Speed可配的参数如下: typedef enum
{
GPIO_INPUT = 0,
GPIO_Speed_2MHz = 1,
GPIO_Speed_10MHz,
GPIO_Speed_50MHz
} GPIO_SpeedType;
GPIO寄存器: 可以看到GPIO寄存器初始化时只需要配置[GPIOx_P(L/H)_CFG],在该寄存器中可以配置全部可能的8种模式。 因此调用 GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure); 实际上只修改了[GPIOx_P(L/H)_CFG]寄存器。
三、配置复用功能重映射 N32G45x的GPIO复用功能是按组进行复用或重映射的。(复用映射组参考用户手册7.2.5章节) 调用以下库函数进行GPIO复用功能重映射 GPIO_ConfigPinRemap(GPIO_RMP_SPI1, ENABLE);
这里有一点需要注意的是开启GPIO复用功能模式后,存在默认映射,不一定需要开启重映射!
当默认连接不满足时,才使用GPIO_ConfigPinRemap()函数进行重映射。
比如当使用PC0、PC1作为I2C3的功能引脚时,只需要开启复用功能即可,不需要使用GPIO_ConfigPinRemap()重映射。 如果使用PF4、PF5作为I2C3的功能引脚,调用GPIO_ConfigPinRemap(GPIO_RMP2_I2C3, ENABLE)进行重映射。 如果使用PC4、PC5作为I2C3的功能引脚,调用GPIO_ConfigPinRemap(GPIO_RMP3_I2C3, ENABLE)进行重映射。
四、作为外功能引脚,该配置为推挽模式还是开漏模式、配置浮空输入还是上拉输入? 很多朋友不清楚什么情况下配置推挽或开漏输出。比如作为I2C功能引脚时,该配置为复用功能开漏输出,还是复用功能推挽输出? 在用户手册7.2.6 外设的IO配置给出了答案。
该章节给出了所有外设使用IO时的配置模式建议。再比如下面USART的配置建议。
|