STM32F0x1/STM32F0x2/STM32F0x8系列每个通用I/O口都有4个32位配置寄存器(GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR 和 GPIOx_PUPDR),2个32位数据寄存器(GPIOx_IDR and GPIOx_ODR)和 1 个32位置位 / 复位寄存器 (GPIOx_BSRR)。GPIOA 和GPIOB 还含有 1 个 32 位锁定寄存器 (GPIOx_LCKR) 和 2 个 32 位替代功能寄存器 (GPIOx_AFRH and GPIOx_AFRL)
根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配
置成多种模式:
每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
BSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之
间产生 IRQ 时也不会发生危险。
标准I/O端口位的基本结构
5V 容忍I/O端口位的基本结构
① GPIO模式
GPIO_Mode_IN 输入模式 ( 复位状态 )
GPIO_Mode_OUT 通用输出模式
GPIO_Mode_AF 复用功能模式
GPIO_Mode_AN 模拟模式
输出模式类型:
GPIO_OType_PP 推免输出
GPIO_OType_OD 开漏输出
② 是否带上/下拉
GPIO_NOPULL 不带上/下拉
GPIO_PULLUP 带上拉
GPIO_PULLDOWN 带下拉
③ 输出速度
GPIO_Speed_2MHz 2 MHz
GPIO_Speed_10MHz 10 MHz
GPIO_Speed_50MHz 50 MHz
步骤:
1、配置对应端口的RCC时钟
/************************************************
函数名称 : RCC_Configuration
功 能 : 时钟配置
参 数 : 无
返 回 值 : 无
作 者 : JayYang
*************************************************/
void RCC_Configuration(void)
{
/* 使能AHB时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);
}
2、配置GPIO工作模式
/************************************************
函数名称 : GPIO_Configuration
功 能 : 基本输入输出引脚配置
参 数 : 无
返 回 值 : 无
作 者 : JayYang
*************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体
//GPIO配置为 推免输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的0脚为高速推免输出模式
//GPIO配置为 开漏输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置使用的GPIO管脚号:1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 设置端口输出类型为:开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的1脚为开漏输出模式
//GPIO配置为 上拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 配置使用的GPIO管脚号:12
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN
GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的12脚为上拉输入模式
//GPIO配置为 下拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 配置使用的GPIO管脚号:13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP
GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的13脚为下拉输入模式
//GPIO配置为 模拟输入输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; // 设置GPIO的模式为输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的0脚为模拟输入模式
//GPIO配置为 复用输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 配置使用的GPIO管脚号:9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 设置GPIO的模式为复用模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的9脚为复用推免输出模式
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2); // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚
}
步骤:
1、通过STM32CubeMX软件配置RCC时钟
选择【Clock Configutration】选项卡进行时钟的设置,如图下图:
2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出
下面进行每个管脚的具体参数配置
点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
/*Configure GPIO pin : PC13 */
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : PC0 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : PA0 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PA1 */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PC12 */
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(timHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspPostInit 0 */
/* USER CODE END TIM1_MspPostInit 0 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM1 GPIO Configuration
PA9 ------> TIM1_CH2
*/
GPIO_InitStruct.Pin = GPIO_PIN_9; //使用9号引脚
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //配置为复用推免输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速输出
GPIO_InitStruct.Alternate = GPIO_AF2_TIM1; //复用为定时器1的通道2
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN TIM1_MspPostInit 1 */
/* USER CODE END TIM1_MspPostInit 1 */
}
}
至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!