芯片概述
C51:0口、1口、2口、3口,P00~p07、P10~P17、P20~P27、P30~P37
STM32:A口、B口、C口、D口,PA0~PA15/PA5 == GPIOA.5
STM32F407ZGT6有7组GPIO端口,分别是:A B C D E F G,每组均有16个GPIO端口,端口编号:0-15。
GPIO模块功能
以STM32F40x芯片为例。
输入浮空 | 在浮空状态下,外界给GPIO端口的电平状态是不确定的,完全由外部输入决定。(一般选择使用时硬件工程师会加上拉或者下拉电阻) |
输入上拉 | 在没有外界输入的情况下,能够让GPIO端口有一个确定的高电平状态。 |
输入下拉 | 在没有外界输入的情况下,能够让GPIO端口有一个确定的低电平状态。 |
模拟功能 | 芯片内部ADC或者DAC专用功能 |
通用开漏输出 | 也叫断开输出(断开MOS管),可以正常输出低电平“0”,没有输出高电平“1”的能力。 如果想输出高电平,则需要配置为具有上拉功能的开漏输出(芯片内部的上拉电阻属于弱上拉,如果需要或者较强的驱动能力,则需要外接一个上拉电阻(硬件工程师设置))。开漏输出慎用,用的时候尽量是在硬件工程师给配置了上拉电阻的时候使用。 |
通用推挽输出 | 单片机给外界输出数据,推挽输出既可以输出高电平也可以输出低电平 |
复用功能开漏输出 | 复用功能指的是GPIO端口的第二功能(除了默认的输入输出功能以外),也就是片内外设(芯片以内内核以外)模块功能管脚的专用功能。 复用功能推挽指的是当GPIO端口作为第二功能时配置为开漏模式输出。 |
复用功能推挽输出 | 复用功能推挽指的是当GPIO端口作为第二功能时配置为推挽模式输出。 |
注:通用/默认:GPIO的输入和输出功能 单片机给外界高低电平或者外界给单片机高低电平。
复用:通过GPIO端口做其他的功能,比如给外界串口数据或者外界将数据/波形发给单片机。
GPIO端口内部框图(STM32F40x芯片)
开漏:P-MOS管断开
置位/复位寄存器与输出数据寄存器的区别:
输出数据寄存器:清0
GPIOB->ODR &= ~(1<<3); //设置PB3为低电平
GPIOB->ODR = GPIOB->ODR &(~(1<<3));
- 先计算1<<3的结果: 000001000b
- 将第一步计算出来的结果~:111111110111b
- 将GPIOB->ODR的默认值取出来:000000000
- 将第三步取出来的值与第二步计算的结果进行相与:0000000000
- 将第四步计算出来的值赋值给ODR寄存器
置位/复位寄存器:清0
GPIOB->BSRRH = 1<<3;
- 计算1<<3的值:00001000b
- 将第一步计算的值赋值给BSRRH即可。
输出数据寄存器:置1
GPIOB->ODR |= 1<<3; //将PB3置一
GPIOB->ODR = GPIOB->ODR | (1<<3);
- 先计算1<<3的结果
- 将计算的结果与ODR的值进行相或
- 将第二步计算的结果赋值给ODR寄存器
置位/复位寄存器:置1
GPIOB->BSRRL = 1<<3;
- 计算1<<3的结果
- 赋值给BSRRL寄存器
GPIO模块相关寄存器(STM32F40x)
时钟使能的概述
为了节省功耗,STM系列单片机专门设置了相关寄存器来控制每一个片内外设模块的时钟使能(开启)或关闭(默认状态下时钟是关闭状态的),在使用任何模块之前都必须先使能对应模块的时钟,否则对对应模块的配置无效。
APBx提供时钟源。
时钟使能相关寄存器
①RCC_AHB1外设时钟使能寄存器
寄存器作用:对AHB1系统总线上的片内外设模块进行时钟使能,在对应的位上写‘1’,则使能相对应的外设模块时钟。
②RCC_AHB2外设时钟使能寄存器
③RCC_AHB3外设时钟使能寄存器
④RCC_APB1外设时钟使能寄存器
⑤RCC_APB2外设时钟使能寄存器
STM32F40x系列时钟使能步骤
1.找出所需要使能时钟的片内外设模块挂载在那一条时钟总线上,参考“英文数据手册2.2章”。
2.找出中文参考手册第六章系统总线对应的时钟使能寄存器,并且在相应的位上写‘1’使能外设模块时钟。
GPIO端口相关寄存器(STM32F40x芯片)
点亮位于PB3的LED6灯,低电平点亮。
GPIO端口模式寄存器
PB3设置为输出模式。
GPIO端口输出类型寄存器
PB3设置为推挽输出
GPIO端口输出速度寄存器
PB3设置高速输出模式
GPIO端口输出数据寄存器
关闭LED6,PB3设置为高电平,ODR3位设置为1;
引脚输出高电平;