文章目录
- 一.概要
- 二.STM32F103C8T6单片机GPIO口特点
- 二.STM32单片机GPIO内部结构图
- 三.单片机GPIO推挽输出信号流向
- 四.单片机GPIO浮空输入信号流向
- 四.单片机GPIO引脚的复用以及重映射
- 五.CubeMX配置一个GPIO输出驱动LED灯例程
- 六.CubeMX工程源代码下载
- 七.讲解视频链接地址
- 八.小结
一.概要
GPIO(general porpose intput output):单片机通用输入输出端口的简称。可以通过单片机烧录的程序代码控制单片机引脚输出高电平或者低电平,也可以读取引脚电平信号为高电平还是低电平。STM32单片机的GPIO引脚与外部设备连接起来,从而实现与外部模块通信,控制以及数据采集的功能。
输出电压:高电平:3.3V,低电平:0V
输入电压:高电平:3.3V,低电平:0V,部分管脚容忍5V输入
引脚图中的 GPIOA—GPIOD口 等均属于 GPIO 引脚。从引脚图可以看出,GPIO 占用了 STM32 芯片大部分的引脚。GPIOA端口,它有 PA0-PA15。
二.STM32F103C8T6单片机GPIO口特点
多达37个多功能的双向IO口:80%的IO口利用率
标准的I/O口可承受5V;
IO口可以吸收25mA(总共可吸收150mA);
18MHz翻转速度;
可设置输出速度达到50MHz;
多达10路模拟输入(ADC);
可改变功能引脚(如:USARTx、TIMx、I2Cx、SPIx、CAN、USB等);
37个IO口可以设置为外部中断(同时可最多可有16个);
一个IO口可用于将MCU从待机模式唤醒(PA0);
一个IO口可用作防入侵引脚(PC13);
所有的IO被分成4个端口(GPIOA—GPIOD);
使用BSRR和BRR寄存器可对IO口的位进行位设置或清除;
二.STM32单片机GPIO内部结构图
如下图所示,GPIO口可以通过寄存器配置成各种模式:
模拟输入(Analog Input)则用于 ADC 电压采集,一般是采集0~3.3V的电压信号。
浮空输入(Input floating)就是读取引脚高低电平信号,完全由外部的输入决定,一般接按键的时候使用这个模式。
上拉下拉输入(Input Pull-Up,Input Pull-Down)就是读取引脚高低电平信号,但开启上拉时引脚默认电压为高电平,开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响,上下拉电阻的值在40K欧姆左右。
推挽模式输出(Output Push-Pull),推挽模式时双 MOS 管以推挽方式工作,配置寄存器可控制 I/O 输出高电平或者低电平
开漏模式输出(Output Open-Drain)开漏模式输出时,只有 N-MOS 管工作,配置寄存器可控制 I/O 输出高阻态或低电平,没法输出高电平,要输出高电平得外部上拉。
复用功能推挽开漏模式(AF Push-Pull,AF Open-Drain),一般I/O口需配置成通讯外设引脚的都时候都需要配置成这个模式。在这个模式下,输出和输出速度都可配置,可工作在开漏及推挽模式,输出信号由外设接口(比如USART,SPI等)决定。一般直接用外设接口的寄存器来获取引脚输入电平信号。
三.单片机GPIO推挽输出信号流向
如下图,1~4就是一个GPIO推挽输出的信号流向:
输出数据寄存器输出一个高电平时,P-MOS 管导通,N-MOS 管截止,对外输出高电平(3.3V)。
输出数据寄存器输出一个低电平时,P-MOS 管截止,N-MOS 管导通,对外输出低电平(0V)。
四.单片机GPIO浮空输入信号流向
如下图,1~4就是一个GPIO浮空输入的信号流向:
从单片机I/O引脚进来就连接到TTL施密特触发器就把电压信号转化为0、1的数字信号存储在输入数据寄存器。
施密特触发器,当输入电压高于正向阈值电压,输出为1,当输入电压低于负向阈值电压,输出为0,当输入在正负向阈值电压之间,输出不改变。
四.单片机GPIO引脚的复用以及重映射
GPIO引脚的复用:
STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。
例如串口1的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作GPIO,而用做复用功能串口1的发送接收引脚的时候,叫端口复用
GPIO软件重映射(Remap):
一些引脚复用功能可以重映射到其他两个不同的引脚上,用于优化引脚的输出和PCB的布线。
比如USART1的TX/RX在PA9/PA10,但如果PA9,PA10已经被当作Timer1 CH2,CH3使用,又想要使用USART1则需要把USART1的TX/RX重映射到PB6,PB7。
五.CubeMX配置一个GPIO输出驱动LED灯例程
硬件准备:
STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
可以查看STM32F103C8T6小系统板原理图,PC13连接LED灯,所以配置PC13为GPIO输出
配置系统主频
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
编译代码
下载程序到单片机
进入调试模式
查看GPIOC端口的寄存器
PC13输出高电平的时候,查看GPIOC寄存器ODR13为1
main代码如下:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();//1ms systick 配置
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();//8M外部晶振,72M系统主频
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();//PC13配置成输出
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);//PC13引脚翻转输出
HAL_Delay(100);//等待100ms
}
/* USER CODE END 3 */
}
//GPIO翻转输出(如果原先是低或者高电平输出,新的就是相反电平输出),GPIO自动生成的库里的函数
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
uint32_t odr;
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
/* get current Ouput Data Register value */
odr = GPIOx->ODR;
/* Set selected pins that were at low level, and reset ones that were high */
GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
}
六.CubeMX工程源代码下载
链接:https://pan.baidu.com/s/1tCvdtLPTl21c2wbA49Rx_g
提取码:q8l9
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
七.讲解视频链接地址
GPIO讲解视频
八.小结
GPIO是STM32单片机开发中的最基本操作,学会了GPIO,可以驱动继电器,LED灯等基本控制。