(自用)嵌入式学习笔记11-STM32_GPIO(标准库)

一、GPIO(General Purpose Input Output)通用输入输出口简介

1.可配置为8中输入输出模式;

2.引脚电平:0V~3.3V,部分引脚可容忍5V;

3.输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等;

4.输入模式下可读取端口的高低电平和电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等。

内核可以通过APB2总线对寄存器进行读写,用以完成输出电平和读取电平的功能。

STM32内的寄存器都是32位的,但是端口只有16位,所以寄存器只有低16位有对应端口,高16位是没有的。

驱动器使用来增加信号的驱动能力的。

二、GPIO位结构

通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式:

 浮空/上拉/下拉输入:

 模拟输入:

 开漏/推挽输出:

 P-MOS如果无效,就是开漏输出,如果P-MOS和N-MOS都有效,就是推挽输出。

复用开漏/推挽输出:

 三、GPIO寄存器

1.端口配置低/高寄存器

2. 端口输出数据寄存器

低16为对应16个引脚,高16为没有使用。 

3.端口位设置/清除寄存器

高16为是进行清除的,低16为是进行位设置的。 

四、GPIO输入、输出代码实现

1.外设对应总线开启RCC时钟使能

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
//使能或失能AHB外设时钟
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
//使能或者失能 APB2 外设时钟
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
//使能或者失能 APB1 外设时钟

 2.GPIO初始化

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
//将外设 GPIOx 寄存器重设为缺省值
void GPIO_AFIODeInit(void);
//将复用功能(重映射事件控制和 EXTI 设置)重设为缺省值
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
//把 GPIO_InitStruct 中的每一个参数按缺省值填入

3.GPIO输入/输出操作

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//读取指定端口管脚的输入
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
//读取指定的 GPIO 端口输入
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//读取指定端口管脚的输出
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
//读取指定的 GPIO 端口输出
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//设置指定的数据端口位
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//清除指定的数据端口位
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
//设置或者清除指定的数据端口位
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
//向指定 GPIO 数据端口写入数据
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//锁定 GPIO 管脚设置寄存器
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//选择 GPIO 管脚用作事件输出
void GPIO_EventOutputCmd(FunctionalState NewState);
//使能或者失能事件输出
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
//改变指定管脚的映射
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//选择 GPIO 管脚用作外部中断线路

输出例子:

将IO口A0、A1设置为推挽输出,并输出高电平1。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//打开GPIOA的时钟使能
GPIO_InitTypeDef GPIO_InitStructure;      //创建初始化IO口的结构体
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;	//选择IO的输出模式为推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;	//选择需要初始化的IO口
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	//选择IO的传输速度
GPIO_Init(GPIOA,&GPIO_InitStructure);    //初始化GPIO

GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);    //设置A0,A1输出1

补:GPIO_Mode的取值范围有:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值