天天看点

STM32F103开发之GPIO的使用

在单片机开发中,最基础也是最重要的一步就是GPIO的使用。在后续的串口、AD转换、外部中断等功能的使用中,GPIO的配置都是重中之重。

在STM32F103中IO口可以被配置成8种模式,分别为:

1、上拉输入(GPIO_Mode_IPU)

2、下拉输入(GPIO_Mode_IPD)

3、浮空输入(GPIO_Mode_IN_FLOATING)

4、模拟输入(GPIO_Mode_AIN)

5、推挽输出(GPIO_Mode_Out_PP)

6、开漏输出(GPIO_Mode_Out_OD)

7、复用推挽输出(GPIO_Mode_AF_PP)

8、复用开漏输出(GPIO_Mode_AF_OD)

在使用固件库进行开发时,首先使用GPIO初始化函数来配置IO口的模式和速度:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTyprDef* GPIO_InitStruct);
           

在这个函数中,共有两个参数,第一个参数用于指定GPIO接口(GPIOA~GPIOG),第二个参数为初始化参数的结构体指针,结构体类型为GPIO_InitTypeDef。

在这个函数中可对指定IO口进行初始化

GPIO_InitTypeDef GPIO_InitStructure;    
//第一步将GPIO定义结构体声明
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2;    
//选择IO引脚为PE2、PE3、PE4
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
//选择工作频率
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   
//选择IO模式
GPIO_Init(GPIOE, &GPIO_InitStructure);   
//将GPIO以上述设置进行初始化
           

将IO口配置完成之后,可对其进行操作,常用下列函数对IO口进行操作,设置IO口的输入和输出状态

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 
//设置IO口的输出状态为高电平

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) ;
//设置IO口的输出状态为低电平

如:设置PA5输出为1,PB5输出为0
GPIO_SetBits(GPIO_A,GPIO_Pin_5);

GPIO_ResetBits(GPIO_B,GPIO_Pin_5);
           

在对单片机的外设进行操作时,第一步必须先将外设对应的时钟使能,之后再对其进行配置,并添加对应的头文件等。

IO操作的步骤如下:

1、使能IO口时钟,调用RCC_APB2PeriphClockCmd()

2、初始化IO参数,调用GPIO_Init()

3、操作IO

/*
在本程序中,控制单片机中的两个LED进行闪烁,在板子上两个LED分别连接于PB5和PE5,当IO口上输出低电平时,LED即被点亮
*/

#include <stm32f10x.h>

void LED_init()
{
  GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 
 //开启GPIOB与GPIOE的时钟

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  //端口配置PB5				 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	//推挽输出	 
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//IO口速度50MHz	 
 GPIO_Init(GPIOB, &GPIO_InitStructure);				//根据设定参数进行初始化	
 GPIO_SetBits(GPIOB,GPIO_Pin_5);					//设置PB5输出高电平	

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    	
 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				
 GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 
}

void delay(u8 time)
{
    u8 i=0 ,j;
    for(i=0; i<time; i++)
        for(j=0; j<100; j++)
            ;
}

int mian(void)
{
    LED_init();    

    while(1)
        {
           GPIO_SetBits(GPIOB,GPIO_Pin_5); 
           GPIO_SetBits(GPIOE,GPIO_Pin_5);
           delay(500);
           GPIO_ResetBits(GPIOB,GPIO_Pin_5); 
           GPIO_ResetBits(GPIOE,GPIO_Pin_5); 
        }

}
           

继续阅读