STM32开发--GPIO详解

GPIOx_CRL :端口配置低寄存器 (控制P0--P7端口)
一个IO位占4个位(4*8=32)P0--P7刚好32位,例如:P0端口:0-1控制输入模式或者输出模式及输出速度,2-3控制输入模式或者输出模式的具体工作方式
GPIOx_CRH:端口配置高寄存器 (控制P8--P15端口)
一个IO位占4个位(4*8=32)P8--P15刚好32位,例如:P8端口:0-1控制输入模式或者输出模式及输出速度,2-3控制输入模式或者输出模式的具体工作方式
GPIOx_IDR:端口输入寄存器
一个位控制一个IO口,0--15对应P0--P15
(注意:IDR寄存器低16位,每个位控制该组IO的一个IO口。对应的是IO口的输入电平)
GPIOx_ODR:端口输出寄存器
一个位控制一个IO口,0--15对应P0--P15
(注意:ODR寄存器跟IDR寄存器相反,是控制IO口输出。低16位每个位控制一个IO口的输出电平的高低。)
输入模式的上下拉输入到底是上拉还是下拉由端口输出寄存器ODR决定。在输入模式时,可设置ODR寄存器的第一位来决定上拉还是下拉
GPIOx_BSRR:端口位设置/清除寄存器
低16位(0--15)是置位,当对应位为1时对应端口置1,对应位为0时对应端口置不受影响
高16位(16--31)是复位,当对应位为1时对应端口置0,对应位为0时对应端口置不受影响
高低位同时作用时,则只有低16位起作用!
GPIOx_BRR :端口位清除寄存器
低16位对应16个端口,作用和GPIOx_BSRR的高16位一样,都是复位清除功能
低16位(0--15)是复位,当对应位为1时对应端口置0,对应位为0时对应端口置不受影响
GPIOx_LCKR:端口配置锁存寄存器
4种输入模式: 输入浮空
输入上拉
输入下拉
模拟输入
4种输出模式: 开漏输出
开漏复用功能
推挽式输出
推挽式复用功能
浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定(输入达到条件就触发),如果在该引脚悬空的情况下,读取该端口的电平是不确定的。







4.开漏复用功能GPIO_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)

GPIO整理后可分为三类:
1. 输入模式(模拟/浮空/上拉/下拉):在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器 GPIOx_IDR读取 I/O 状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候用的是浮空输入。模拟输入则用于 ADC 采集。
2. 输出模式(推挽/开漏):在输出模式中,推挽模式时双 MOS 管以轮流方式工作,输出数据寄存器GPIOx_ODR可控制 I/O 输出高低电平。开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制I/O输出高阻态或低电平。输出速度可配置,有 2MHz\10MHz\50MHz 的选项。此处的输出速度即 I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。
在输出模式时施密特触发器是打开的,即输入可用,通过输入数据寄存器 GPIOx_IDR可读取 I/O 的实际状态。
3.复用功能(推挽/开漏):复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器 GPIOx_ODR 无效;输入可用,通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。
应用场合
①上拉输入、下拉输入可以用来检测外部信号,例如按键等。
②浮空输入模式,由于输入阻抗较大,一般把这种模式用于标准通信协议的I2C、USART的接收端。
③普通推挽输出模式一般应用在输出电平为0和3.3V的场合<。而普通开漏输出模式一般应用在电平不匹配的场合,如需要输出5V的高电平,就需要在外部一个上拉电阻。电源为5V,把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5V电平。
④对于相应的复用模式,复用输出来源片上外设,则是根据GPIO的复用功能来选择,如GPIO的引脚用作串口的输出(USART/SPI/CAN),则使用复用推挽输出模式。如果用在I2C、SMBUS这些需要线与功能的复用场合,就使用复用开漏模式。
⑤在使用任何一种开漏模式时,都需要接上拉电阻。
1、作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
2、作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
3、作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
4、作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
5、作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。
//初始化PB5为输出口.并使能这个端口的时钟 //LED IO初始化 void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高 }
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1); //读取PA1的输入电平
GPIO_ReadInputData(GPIOA); //读取PA端口16位的输入数据
GPIO_ReadOutputDataBit( GPIOA, GPIO_Pin_1); //读取PA1的输出电平
GPIO_ReadOutputData(GPIOA); //读取PA端口16位的输出数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)