stm32 GPIO输入输出

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.输入模式

  1. 输入浮空模式 GPIO_Mode_IN_FLOATING
    外部电路通过I/O端口输入电平,外部电平在经过施密特触发器之后继续传输到输入数据寄存器IDR,CPU通过读输入数据寄存器实现读取外部输入电平值的目标。
    I/O电平状态完全由外部输入决定,引脚悬空时该I/O口电平状态不确定。

  2. 输入上拉模式 GPIO_Mode_IPU
    上拉电阻工作,外部有输入时,电平与外部输入信号相同;外部无输入时保持高电平。

  3. 输入下拉模式 GPIO_Mode_IPD
    下拉电阻工作,外部有输入时,电平与外部输入信号相同;外部无输入时保持高电平。

  4. 输入模拟模式 GPIO_Mode_AIN
    I/O端口的模拟信号直接通过模拟输入通道输入到CPU,不会进入输入数据寄存器,IO口外部电压为模拟量(电压形式非电平形式),作为模拟输入范围一般为0~3.3V。

2.输出模式

  1. 开漏输出模式 GPIO_Mode_Out_OD
    输出的高低电平的来源,让CPU直接写进输出数据寄存器。
    控制输出为0时,低电平,使输出接地。若控制输出为1(它无法直接输出高电平)时,引脚既不输出高电平,也不输出低电平,为高阻态,为正常使用时必须外部接上拉电阻,输出的高电平为上拉电阻所接电源的电压。
    如果多个开漏输出模式引脚接在一起,与同一个外接上拉电阻相连,则具有“与”特性。

  2. 开漏复用输出模式 GPIO_Mode_AF_OD
    与开漏输出模式相同,只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。

  3. 推挽输出模式 GPIO_Mode_Out_PP
    CPU控制输出信号,输出数据寄存器是0时输出低电平;是1时输出高电平。

  4. 复用推挽输出模式 GPIO_Mode_AF_PP
    输出信号由外设复用功能输出决定。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值