1.寄存器操作
#define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C)
//(unsigned int*)(GPIOB_BASE+0x0C)是一个指向GPIOB组ODR寄存器的指针
//在这个指针前面加*,就可以直接访问指针所指向的对象,也就是GPIOB组ODR寄存器
GPIOB_ODR |= (0x01<<pin);//将GPIOX的输出寄存器pin位置为1,用或不影响其它位状态
GPIOB_ODR &= ~( 0x01<<pin;)//将GPIOX的输出寄存器某位置为0,取反和且不影响其它位状态
2.库函数操作
函数操作是位操作的封装
//函数定义在stm32f10x_gpio.c
//GPIO_TypeDef* GPIOx在stmf10x.h宏定义,GPIOA-G
//GPIO_Pin在stm32f10x_gpio.h宏定义,GPIO_Pin_0-15
//读GPIO口位状态
GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
//读GPIO口组状态
GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
//将GPIO口位状态置零
GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
//将GPIO口位状态置1
GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
//自己选置0还是置1
GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
3.位带操作
//pin是数字0-15
PXout(pin)=0
PXout(pin)=1
把对应的GPIO引脚输出设为高或低
PXout(pin)会直接返回对应的GPIO口位输出状态
PXin(pin)会直接返回对应的GPIO口位输入状态
三种方式实现相同功能
//初始化GPIO端口在LED_Init()里,不写了,B和E组5端口设为输出
//寄存器实现
#define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C)
#define GPIOE_ODR *(unsigned int*)(GPIOE_BASE+0x0C)
int main(void)
{
delay_init(); //初始化延时函数
LED_Init(); //初始化LED端口
while(1)
{
GPIOB_ODR &= ~(0x01<<5);
GPIOE_ODR |= (0x01<<5);
delay_ms(300); //延时300ms
GPIOB_ODR |= (0x01<<5);
GPIOE_ODR &= ~(0x01<<5);
delay_ms(300); //延时300ms
}
}
//库函数实现
int main(void)
{
delay_init(); //初始化延时函数
LED_Init(); //初始化LED端口
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
delay_ms(300); //延时300ms
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
delay_ms(300); //延时300ms
}
}
//位带实现
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
LED0=0;
LED1=1;
delay_ms(300); //延时300ms
LED0=1;
LED1=0;
delay_ms(300); //延时300ms
}
}
*GPIO工作模式
1.输入模式
-
输入浮空模式 GPIO_Mode_IN_FLOATING
外部电路通过I/O端口输入电平,外部电平在经过施密特触发器之后继续传输到输入数据寄存器IDR,CPU通过读输入数据寄存器实现读取外部输入电平值的目标。
I/O电平状态完全由外部输入决定,引脚悬空时该I/O口电平状态不确定。 -
输入上拉模式 GPIO_Mode_IPU
上拉电阻工作,外部有输入时,电平与外部输入信号相同;外部无输入时保持高电平。 -
输入下拉模式 GPIO_Mode_IPD
下拉电阻工作,外部有输入时,电平与外部输入信号相同;外部无输入时保持高电平。 -
输入模拟模式 GPIO_Mode_AIN
I/O端口的模拟信号直接通过模拟输入通道输入到CPU,不会进入输入数据寄存器,IO口外部电压为模拟量(电压形式非电平形式),作为模拟输入范围一般为0~3.3V。
2.输出模式
-
开漏输出模式 GPIO_Mode_Out_OD
输出的高低电平的来源,让CPU直接写进输出数据寄存器。
控制输出为0时,低电平,使输出接地。若控制输出为1(它无法直接输出高电平)时,引脚既不输出高电平,也不输出低电平,为高阻态,为正常使用时必须外部接上拉电阻,输出的高电平为上拉电阻所接电源的电压。
如果多个开漏输出模式引脚接在一起,与同一个外接上拉电阻相连,则具有“与”特性。 -
开漏复用输出模式 GPIO_Mode_AF_OD
与开漏输出模式相同,只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。 -
推挽输出模式 GPIO_Mode_Out_PP
CPU控制输出信号,输出数据寄存器是0时输出低电平;是1时输出高电平。 -
复用推挽输出模式 GPIO_Mode_AF_PP
输出信号由外设复用功能输出决定。