STM32的GPIO的初始化解析

本文介绍了一种基于STM32的LED I/O口初始化方法,包括使能时钟、配置IO口模式及输出高电平等步骤。使用GPIO_InitTypeDef结构体进行配置。

//LED的I/O口初始化程序 :顺序:1.是能io口时钟 2.初始化io口模式 ,配置相关参数(包括速度,pin脚,mode,最后进行配置)
//3.操作io口,输出高电平


void LED_Init(void)   
{
 
 GPIO_InitTypeDef  GPIO_InitStructure; //定义一个名为 GPIO_InitStructure的结构体变量 
 /* 
 GPIO_InitTypeDef为一结构体变量,其中有三个类型变量, GPIO_Pin、GPIO_Speed 、GPIO_Mode
						 typedef struct
						{
						  uint16_t GPIO_Pin;            
						  GPIOSpeed_TypeDef GPIO_Speed;  
						  GPIOMode_TypeDef GPIO_Mode;    
						}GPIO_InitTypeDef; 
			这其中 GPIOSpeed_TypeDef为枚举变量 ,即  GPIO_Speed只能从下面的三个中选一个 
							     typedef enum
								{ 
								  GPIO_Speed_10MHz = 1,
								  GPIO_Speed_2MHz, 
								  GPIO_Speed_50MHz
								}GPIOSpeed_TypeDef;   
								 
            GPIOMode_TypeDef也是一枚举类型,即 GPIO_Mode也只能从下面的八个模式中选一个 
                                 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
								}GPIOMode_TypeDef;
			 
*/	
 //使能I/O口时钟,注意不同的I/O口使能函数不一样 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//是能GPIOB组的时钟 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//是能GPIOE组的时钟
 
 // 配置GPIOB的模式 :配置成GPIOB.5,频率50MHz,推挽输出模式 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		
 GPIO_Init(GPIOB, &GPIO_InitStructure);	//该句是将上面的信息配置到GPIOB端口,该句不能写在前面,设定好的信息才能进行配置				 
 GPIO_SetBits(GPIOB,GPIO_Pin_5);     //作用:GPIOB.5输出为高 ,与之相对应的为ResetBits输出为低 
			 /*
			 void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
			{
			  // Check the parameters    /参数核对 
			  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));//核对端口是不是规定的端口GPIOA-GPIOG 
			  assert_param(IS_GPIO_PIN(GPIO_Pin));    //核对 GPIO_PIN是不是规定的GPIO_Pin_0-15 (详见源代码) 
			  
			  GPIOx->BSRR = GPIO_Pin; 
			//  GPIO_Pin_5对应的高电平0x0020(后两位0x20(十进制为32)对应二级制为0b010 0000)值正
			//好对应的为BSRR寄存器的第六位,所以PB.5输出高电平 
			}
			 */ 
  
     
 // 配置GPIOE的模式	:配置成GPIOB.5,频率50MHz,推挽输出模式,和B的一样,
 //所以战舰提供的省略了相同的,我这里为了便于理解没有省略					 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	    	
 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 
 GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 
}

### STM32 GPIO 初始化示例代码与教程 STM32GPIO 初始化通常涉及以下几个步骤:使能时钟、配置引脚模式和速度、应用初始化结构体以及设置输出状态或输入上下拉电阻。以下是一个完整的初始化示例代码,结合了引用中的内容[^3]。 ```c #include "stm32f10x.h" // 根据具体的芯片型号选择对应的头文件 void GPIO_InitExample(void) { GPIO_InitTypeDef GPIO_InitStruct; // 1. 使能GPIOA的时钟(必须!) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 2. 配置PA5为推挽输出模式 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; // 选择PA5 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStruct); // 应用配置 // 3. 设置PA5的输出状态 GPIO_SetBits(GPIOA, GPIO_Pin_5); // PA5输出高电平 } int main(void) { GPIO_InitExample(); // 调用初始化函数 while (1) { // 主循环逻辑 } } ``` 上述代码展示了如何将 STM32GPIO 配置为推挽输出模式,并设置其输出状态为高电平[^3]。此外,还可以根据需求配置其他模式,例如浮空输入、上拉/下拉输入等[^5]。 --- ### 上拉/下拉输入配置示例 如果需要配置 GPIO 为上拉或下拉输入模式,可以参考以下代码: ```c void GPIO_InputExample(void) { GPIO_InitTypeDef GPIO_InitStruct; // 使能GPIOB的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 配置PB0为上拉输入模式 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入模式 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); // 读取PB0的输入状态 uint8_t value = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0); } ``` 在该示例中,PB0 被配置为上拉输入模式,并通过 `GPIO_ReadInputDataBit` 函数读取其电平状态[^3]。 --- ### 常见问题解析 在实际开发中,可能会遇到一些问题。例如,在引用[4]中提到的代码差异问题,原因可能在于指针未正确初始化。以下是修正后的代码: ```c void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; // 必须定义为普通结构体而非指针 // 使能GPIOA和GPIOE的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE, ENABLE); // 配置GPIOE的3号和4号引脚为上拉输入 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStruct); // 配置GPIOA的0号引脚为下拉输入 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 修正的关键在于确保 `GPIO_InitStruct` 是一个普通结构体,而不是指针类型[^4]。 --- ### 其他模式配置 根据具体需求,可以配置不同的 GPIO 模式,包括但不限于: - **浮空输入**:`GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;` - **模拟输入**:`GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;` - **复用推挽输出**:`GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;` - **复用开漏输出**:`GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;` 每种模式都有其特定的应用场景,需根据实际需求进行选择[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值