3-STM32F103-GPIO学习

发布于:2025-05-19 ⋅ 阅读:(16) ⋅ 点赞:(0)

摘要

在上一篇文章中,我们讲解了STM32F103C8T6最小系统中复位和时钟软件部分。此时单片机内部SYSCLK已经通过外部8MHz的HSE通过PLL进行9倍频之后,变为72MHz。最小系统搭建完成后,我们就可以开始进行软件编程了,通过编程来控制STM32F103上的各个引脚和内部外设。本文讲解通用输入输出GPIO的使用,并在最后做点亮LED灯的实验。

说明

本系列,将整理STM32F103内置外设的使用,“基于标准库“进行学习开发,并将手册说明与标准库代码进行对应学习,在文章最后提供本系列中参考的文章和工程代码下载链接。

本文参考资料如下:


## 1.硬件平台
STM32F103C8T6最小系统板
## 2.软件平台
MDK5
## 3.参考文档
1.《1-STM32F10x-中文参考手册》
2.《3-STM32F103xCDE数据手册-中文》
3. 《STM32F103C8T6核心板原理图》
4.《Cortex-M3权威指南》

一、GPIO介绍

GPIO即是通用输入输出 General Purpose Input/Output 的英文首字母缩写,一个IO既有可以做通用输入也可以做通用输出还可以复用。所谓通用即没有连接单片机内部其它外设的IO口,在stm32中与通用相对应的叫复用,即连接了单片机内部其它外设的IO。比如PA9和PA10,可用作通用的GPIO,也可以复用成USART1的TX和RX。IO是单片机引脚的统称,PA9是一个IO,PA10也是一个IO。

二、GPIO的工作模式

2.1 GPIO结构图

GPIO结构图

如图GPIO结构图所示,有两条主线:①输出和②输入。主要就是做输出模式和输入模式。

2.2 输出模式

4种输出模式

输出模式一共4种:推挽输出、复用推挽输出、开漏输出、复用开漏输出,区别如下图所示。以输出驱动器为中心,左边可以由①做输入,也可以由②做输入;右边可以导通PMOS输出高电平,也可以导通NMOS输出低电平。左边2种选择,右边两种选择,组合起来就是2*2=4种模式。

2.2.1 推挽输出

①+③和④构成推挽输出,即单片机内核直接控制IO上是高电平3.3V还是低电平0V。通过写BSRR(位设置/清除寄存器)或者直接写ODR寄存器来设置ODR(输出数据寄存器),即可控制IO上电平的高低,在BSRR对应的位写1即IO口上为输出高电平3.3V,在BSRR对应的位写0即IO口上为输出低电平0V。如PA9配置为推挽输出时,让PA9输出3.3V,使用GPIOA->BSRR |= (1<<9); 将ODR第9位置1,从而可让PA9输出高电平3.3V,也可以直接配置ODR寄存器,GPIOA-ODR |= (1<<9),让PA9输出高电平。点亮LED实验中,就是将IO口配置为推挽输出模式,单片机内核直接控制IO口的高低电平。
BSRR寄存器图

ODR寄存器图

推挽的由来:③和④处是由PMOS和NMOS管连接在一起,这两个mos管在同一时刻,只能打开一个,如果打开的是PMOS,则IO口上输出的是高电平VDD,如果打开的是NMOS,则IO口上输出的是低电平VSS。PMOS打开时电流是从VDD流向IO口,像是把电流推出去,所以叫推,而NMOS打开时电流是从IO口流向VSS,像是把电流从IO口挽回进来,所以叫挽。如下图所示:
推

挽

2.2.2 复用推挽输出

复用推挽输出和推挽输出的区别在于①和②处,复用推挽输出驱动器的输入源来自②处,而推挽输出驱动器的输入源来自①处。②处是由单片机内部外设来控制,而不是由内核来直接控制了。内核控制单片机片上外设,片上外设再来控制IO口上电平的变化。比如PA9可以复用为USART1_TX,我们想使用USART1来发送数据时,就可以将PA9配置为复用输出模式,然后我们编写代码控制USART1即可,USART1这个片上外设会按照串口协议去控制PA9上电平的变化。

2.2.3 开漏输出

推挽输出和开漏的区别在③和④处,在推挽输出模式中,可以通过①控制PMOS和NMOS的开和关,但是开漏模式中,只能控制NMOS,而无法控制PMOS。所以只能输出低电平,而无法输出高电平,想要输出高电平,得外接上拉电阻,所以不常用,在 《1-STM32F10x-中文参考手册》的8.1.11外设的GPIO配置中,也没有看到使用那个外设时,需要将IO配置为开漏模式,所以这个模式很少使用,可以不用关注。

2.2.4 复用开漏输出

复用开漏输出与开漏输出的区别在于,开漏输出中驱动器的输入源是内核①,而复用开漏输出中驱动器的输入源是片上外设②。

2.3 输入模式

4种输入模式

输入模式也是4种,浮空输入、模拟输入、上拉输入、下拉输入。在此模式中,输出驱动器会被关闭,所以也就没法输出了,只能输入。输入模式中,IO口上的电平由单片机外部电路控制,单片机被动读取IO口上电平变化,在输出模式中是单片机控制IO口上电平的变化,外部电路被动接收。输入模式和输出模式是相反的两个过程。

2.3.1 浮空输入

浮空输入模式中,即单片机内核可以读取输入数据寄存器的值,来判定IO口上是高电平还是低电平。在按键KEY实验中,单片机需要读取按键是否按下时,就可以将IO口配置为浮空输入模式,单片机来读取IDR寄存器是1还是0,就可以判断按键是否被按下。

2.3.2 模拟输入

模拟输入模式,与模拟量相对的数字量,在浮空输入中,TTL肖特基触发器会将IO口上的模拟量转换为数字量。在ADC实验中,为了获取到IO口上的模拟量,就需要将IO口配置为模拟输。入在 《1-STM32F10x-中文参考手册》的8.1.11外设的GPIO配置中,ADC引脚必须配置为模拟输入,DAC实验中也是,需要特别注意,如下图所示。
ADC配置为模拟输入

2.3.3 上拉输入和下拉输入

上拉和下拉其实不是一种单独的模式,需要和浮空输入一起使用,但是在STM32F1系列中,上拉和下拉与浮空输入是并列的一种模式,其内部实现其实就是在浮空输入的基础上将IO口初始电平拉高或者拉低,配置为上拉或者下拉是将OD寄存器对应的位写1或0。在 《1-STM32F10x-中文参考手册》的8.1.11外设的GPIO配置中将IO复用为USARTx_RX时需要接上拉输入。这个上拉是弱上拉,外部需要将IO拉低时,IO口上电平也是能被拉低到0V的,下拉也是弱下拉,如果外部将IO口拉高到3.3V,IO口上电平也是能够被拉高到3.3V的。

上拉和下拉通过配置ODR实现

三、点灯实验

3.1 硬件电路连接

硬件电路连接

如图所示,将单片机核心板的PC13与LED连接起来,记得串联一个10K左右的电阻,不然LED灯会被烧坏。

3.2 软件编码

3.2.1. LED.h文件中代码如下:

#ifndef __LED_H
#define __LED_H	 

#include "stm32f10x.h"

#define   LED_RCC_CLK     RCC_APB2Periph_GPIOC
#define   LED_GPIO_PORT   GPIOC
#define   LED_GPIO_PIN    GPIO_Pin_13

#define   LED_ON()        GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PIN)
#define   LED_OFF()       GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PIN)

void LED_Init(void);
		 				    
#endif

3.2.2.LED.c文件中代码如下

将LED_GPIO_PIN这个IO配置成推挽输出,PC13这个引脚上的电压由单片机内核控制,调用LED_ON和LED_OFFF即可打开和关闭ELD。

#include "led.h"

void LED_Init(void)
{

    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(LED_RCC_CLK,ENABLE);	 //使能PC时钟,使用STM32片上任何一个外设,都需要打开对应的时钟

    GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN;				 //LED-->PC13 端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);					 //根据设定参数初始化PC13

    LED_OFF();

}

3.2.3 main.c文件中代码如下:

在main函数中,初始化LED,并开启LED,下载程序后,可以看到LED灯常亮。

#include "led.h"

 int main(void)
 {	

    LED_Init();		  	//初始化与LED

    LED_ON();
     
    while(1) 
    {

    }

 }

四、总结

GPIO八种模式,实际上就三种模式浮空输入模式、推挽输出模式、复用推挽输出模式,点亮LED灯实验中,就是推挽输出模式,读取按键KEY实验中,就是浮空输入模式,串口USART1进行收发数据时,就是复用推挽输出模式和浮空输入模式。通常一个引脚作为通用IO时,需要输出就配置成推挽输出模式,需要输入时就配置成浮空输入模式。当作为复用IO时,具体配置为那种模式可以查看 《1-STM32F10x-中文参考手册》的8.1.11外设的GPIO配置,如下图USARTx_RX配置所示:
USART_RX配置为上拉输入或浮空输入

五、文中参考资料和源代码链接如下

https://gitee.com/muzi_wood/stm32-f103


网站公告

今日签到

点亮在社区的每一天
去签到