在单片机开发中,最基础也是最重要的一步就是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);
}
}