gpio
- 前言
- 一、GPIO配置和初始化
- 二、常用函数和单词
- 1.常用函数
- gpio_init():初始化函数 可以选择GPIO端口(port),引脚(PIN)、输出模式、输出速度和管脚。
- gpio_bit_set():对GPIOA端口的pin0管脚的值设置为1。
- gpio_bit_reset():对GPIOA端口的pin0管脚的值设置为0。
- gpio_bit_write():将0或者1写入GPIOX的某个引脚。
- gpio_port_write():将0或者1组成的数字(二进制)写入端口
- gpio_input_bit_get():获取引脚pin的输出值
- gpio_input_port_get():获取GPIO端口的输入值
- gpio_output_bit_get():获取引脚PIN的输出值
- gpio_output_port_get():获取某个端口的输出值。
- gpio_exti_source_select():选择哪个引脚作为EXTI源
- 三、GPIO的8种工作模式
- 四、总结一下:
- 五 记录一些奇怪的事项
- 六、关于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);
}