GPIO知识总结


前言

关于GPIO的知识点汇总,后期会补充


一、GPIO配置和初始化

	/*使能GPIO的时钟*/
	rcu_periph_clock_enable(RCU_GPIOA);
	
	/*GPIO初始化*/
	gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_8);

二、常用函数和单词

1.常用函数

gpio_init():初始化函数 可以选择GPIO端口(port),引脚(PIN)、输出模式、输出速度和管脚。

void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, uint32_t pin);
//periph:外设
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_8);

在这里插入图片描述

gpio_bit_set():对GPIOA端口的pin0管脚的值设置为1。

void gpio_bit_set(uint32_t gpio_periph, uint32_t pin);
gpio_bit_set(GPIOA, GPIO_PIN_0);
//periph:外设

gpio_bit_reset():对GPIOA端口的pin0管脚的值设置为0。

void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin);
gpio_bit_reset(GPIOA, GPIO_PIN_0);
//periph:外设

gpio_bit_write():将0或者1写入GPIOX的某个引脚。

void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value);
gpio_bit_write(GPIOA, GPIO_PIN_0, SET);//对GPIOA端口的pin0管脚写入1。
gpio_bit_write(GPIOA, GPIO_PIN_0, RESET);//对GPIOA端口的pin0管脚写入0。

gpio_port_write():将0或者1组成的数字(二进制)写入端口

void gpio_port_write(uint32_t gpio_periph, uint16_t data);
/* write 1010 0101 1010 0101 to Port A */
gpio_port_write(GPIOA, 0xA5A5);

gpio_input_bit_get():获取引脚pin的输出值

FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin);//FlagStatus是一个枚举变量,其值为SET(1)和RESET(0)。
/* get output status of PA0 */
FlagStatus bit_state;
bit_state = gpio_output_bit_get(GPIOA, GPIO_PIN_0);

gpio_input_port_get():获取GPIO端口的输入值

uint16_t gpio_input_port_get(uint32_t gpio_periph);
/* get input value of Port A */
uint16_t port_state;
port_state = gpio_input_bit_get(GPIOA);

gpio_output_bit_get():获取引脚PIN的输出值

FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin);
/* get output status of PA0 */
FlagStatus bit_state;
bit_state = gpio_output_bit_get(GPIOA, GPIO_PIN_0);

gpio_output_port_get():获取某个端口的输出值。

uint16_t gpio_output_port_get(uint32_t gpio_periph);
/* get output value of Port A */
uint16_t port_state;
port_state = gpio_output_port_get(GPIOA);

gpio_exti_source_select():选择哪个引脚作为EXTI源

void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin);
例如:
/* config PA0 as EXTI source */
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0);

三、GPIO的8种工作模式

在这里插入图片描述
在这里插入图片描述

四、总结一下:

1.按钮、传感器等设备连接的GPIO口

都采用输入模式,来接收他们产生的信号。具体那种输出模式需要配合原理图来分析。
在这里插入图片描述
当我们不知道外部电路时:遵循原则为:

在这里插入图片描述

3.LED灯,蜂鸣器、陀螺仪等需要供电的设备

都采用输出模式,对外部这些设备提供到高电平或者低电平。一般可直接采用推挽输出模式,可以提供高低电平。

4.USART的RX引脚,TX引脚对应的GPIO口

USART的RX引脚的输入功能,采用浮空输入或者上拉输入。Why?串口停止位和空闲状态默认为高电平。TX采用复用推挽输出模式。注意:输入模式无复用功能,输出模式采用复用功能。

5.I/O连接到EXTI线后,对应的GPIO口

采用浮空输入模式,采集电平的上升沿和下降沿的数据。

五 记录一些奇怪的事项

例子:LED采用输出模式提供高电平点亮灯,想获取该灯的状态,即如果获取到高电平则可知该灯是亮的状态,却可以采用
在这里插入图片描述
why?本人猜测是这样的
在这里插入图片描述

六、关于GPIO的一些实例代码:

1 LED灯点亮代码

在这里插入图片描述
需要给LED1供电,采用推挽输出模式给PA8管脚置一个高电平。

int main(void)
{
	/*使能GPIO的时钟*/
	//RCU_APB2EN |= 1 << 2;
	rcu_periph_clock_enable(RCU_GPIOA);
	/*配置为推挽输出模式*/
	//GPIOA_CTL1 = 0x44444442;
	gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_8);
	gpio_bit_write(GPIOA, GPIO_PIN_8, SET);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值