深入学习STM32F103C8T6的GPIO控制

目录

一,GPIO是什么

二,GPIO 基本结构

1, GPIO在STM32的位置

2,STM32的GPIO对应的引脚

三,GPIO的八种模式

2. GPIO_MODE_IN_FLOATING 浮空输入

3. GPIO_MODE_IPD 下拉输入

4. GPIO_MODE_IPU 上拉输入

5. GPIO-MODE_OUT_OD 开漏输出

6. GPIO_MODE_OUT_PP 推挽输出

7. GPIO_MODE_AF_OD 复用开漏输出

8. GOIO_MODE_AF_PP 复用推挽输出

四,总结


一,GPIO是什么

        GPIO是通用输入输出引脚,它是STM32芯片上的数字接口,可以被软件配置为输入或输出,在连接外部设备时发挥重要作用。它们可以使用寄存器级操作进行配置和控制,因此具有灵活性和可编程性。GPIO口都可以根据需要被配置为数字输入(input)或数字输出(output)模式。在输入模式下,GPIO口接收外部设备产生的电信号,并将其转换为数字信号传递给处理器。在输出模式下,GPIO口将处理器输出的数字信号转换为电信号,并向外部设备发送。这里提醒一下小伙伴们,有些GPIO口是不能直接配置的,比如下面STM32F103C8T6的引脚定义图里的PC13,PC14和PC15引脚通过电源开关进行供电,且同一时间,三个引脚中只有一个引脚能作为输出引脚,这就意味这这不是普通的GPIO,需要进行特别的配置才可以用,这里给大家分享一下更改之后的代码:

PWR_BackupAccessCmd(ENABLE);//允许修改RTC 和后备寄存器
RCC_LSEConfig(RCC_LSE_OFF);//关闭外部低速外部时钟信号功能后,PC13 PC14 PC15 才可以当普通IO用。
BKP_TamperPinCmd(DISABLE);//关闭入侵检测功能,也就是 PC13,也可以当普通IO 使用
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);/*开C口时钟,复用时钟。*/




GPIO_InitTypeDef GPIO_InitStructure;//结构体定义
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13 |GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//设为输出,注意:2MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);

PWR_BackupAccessCmd(ENABLE);//允许修改RTC 和后备寄存器

 

二,GPIO 基本结构

1, GPIO在STM32的位置

在STM32中,所有的GPIO都是挂载在APB2外设总线上 。

                     图1

2,STM32的GPIO对应的引脚

                         图2

       如上图2所示,  的GPIO寄存器有32位,PA0 — PA15 只用了16位,只用到了低16位,而高16位闲置。驱动器用来增强驱动能力  其命名方式为 GPIOA \rightarrow PA  ; GPIOB \rightarrowPB;GPIOC \rightarrow PC。

三,GPIO的八种模式

        GPIO的八种模式又分为四种输入模式和四种输出模式,这里主要介绍八种模式功能及其对应的适用场景。

1. GPIO_MODE_AIN 模拟输入

        在该模式下,GPIO引脚被配置为模拟信号输入,主要用于ADC。ADC模块可以将引脚读取到的模拟信号转换成数字信号进行处理。这种模式适用于需要精确模拟量信号输入的场合,如温度传感器、光传感器等。
        举例:在一个机器人系统中,需要使用光传感器来检测周围环境的亮度。可以将GPIO引脚配置为模拟输入模式,并将光传感器连接到引脚和地之间,此时ADC模块可以将读取到的模拟信号转换成数字信号进行处理。

2. GPIO_MODE_IN_FLOATING 浮空输入

        在该模式下,GPIO引脚处于高阻态且未选通上拉或下拉电阻。这种模式适用于数字输入信号不需要精度要求的场合,例如控制系统中一些状态量检测、接近传感器等的信号输入。但是,在使用输入浮空模式时,需要注意防止静电干扰和误操作。
        举例:在一个控制系统中,检测两个机械部件之间距离的传感器,只需输出0或1两个状态值,可以使用输入浮空模式。

3. GPIO_MODE_IPD 下拉输入

        浮空输入在外界没有输入时状态不确定,可能对电路造成干扰。为了使得电路更加稳定,不出现没有输入时端口的输入数据被干扰 (比如手碰一下电压就发生变化)。这时就需要下拉电阻(或上拉电阻),此电阻与端口输入阻抗相比仍然较小。有输入信号时端口读取输入信号,无输入信号时端口电平被拉到低电平(高电平)。

        举例:在嵌入式设备中,如果需要使用按键来进行控制,可以将GPIO引脚配置为输入下拉模式,并将按键连接到引脚和VDD之间,在此模式下,当按键不被按下时,引脚处于低电平状态,当按键被按下时,引脚变为高电平状态。

4. GPIO_MODE_IPU 上拉输入

        上拉输入与下拉输入类似,只是无输入信号时端口电平被拉到高电平。例如按键信号,当按下时输入低电平,松开时电平被拉到高电平。这样就不会出现按键松开时端口电平不确定的情况。即不知道时按下还是松开。

        举例:在嵌入式设备中,如果需要使用按键来进行控制,可以将GPIO引脚配置为输入上拉模式,并将按键连接到引脚和地之间,在此模式下,按键不被按下时,引脚处于高电平状态,当按键被按下时,引脚变为低电平状态。

5. GPIO-MODE_OUT_OD 开漏输出

        开漏输出即漏极开路输出。这种输出方式指场效应管漏极开路输出。需要接上拉电阻才能输出1。漏极经上拉电阻接到电源,栅极输出0时,场效应管截止(阻抗无线大),电压被分到场效应管上,此时输出为1。当栅极输出1时,场效应管导通,输出端口相当于接地,此时输出0。开漏输出高电平时是由外接电源输出的,因此可以实现高于输出端口电压的输出。可以实现电平的转换。开漏输出可以实现线与功能,方法是多个输出共接一个上拉电阻。但是漏极开路输出上升沿慢,因为上升沿是外接电源对上拉电阻以及外接负载充电。当上拉电阻较大或者负载容性较大时时间常数较大,充电较慢。需要较快反映时可以采用下降沿触发,此时没有电阻接入,电路的时间常数较小,充电较快。

        举例:STM32使用I2C通讯时,SDA和SCL都要使用开漏输出模式。这是因为I2C通讯总线中,SDA和SCL线都可能出现多主机同时发送数据的情况,为避免数据冲突,需要将SDA和SCL配置成开漏输出模式,并且使用外部上拉电阻将它们拉升到高电平。

6. GPIO_MODE_OUT_PP 推挽输出

        推挽输出既可以输出1,又可以输出0。但是无法调节输出电压,因为输出高低电平均为三极管输入端电压,此电压在由芯片内部供电,无法改变。推挽输出任意时刻只有一路工作,推挽输出损耗小、速度快。

        举例:在一个机器人系统中,需要通过GPIO引脚来控制机器人的运动方向,例如前进、后退、左转、右转等。可以将GPIO引脚配置为推挽输出模式,并将引脚连接到电机驱动芯片,此时引脚可以直接驱动电机的正反转。

7. GPIO_MODE_AF_OD 复用开漏输出

        STM32单片机内部有其他的外设,比如定时器、DAC等。复用开漏输出与普通开漏输出区别在于,开漏输出输出的是输出数据寄存器中的数据,复用开漏输出输出的是来自外设的数据。

        举例:在一个机器人系统中,需要使用I2C总线来进行控制。可以将GPIO引脚配置为开漏式复用功能模式,并将SCL连接到引脚上。此时,引脚被配置为开漏输出模式,可以驱动I2C总线中的SCL时钟线。

8. GOIO_MODE_AF_PP 复用推挽输出

        在该模式下,GPIO引脚可以被配置为一些标准的或自定义的功能,例如USART通信的TX、RX数据线。这种模式下,GPIO引脚被配置为推挽输出模式,适用于直接驱动负载或者数据通讯。
        举例:在一个机器人系统中,需要使用串口通信来进行数据传输。可以将GPIO引脚配置为推挽式复用功能模式,并将TX、RX数据线连接到引脚上。此时,引脚被配置为推挽输出模式,可以直接驱动负载或进行数据通讯。

四,总结

        这里我是引用用了这位博主(喝雪碧要加盐)的对GPIO的总结,更简洁明了,方便大家记忆。

        感谢大家的阅读,希望文章对你们有所帮助,也希望各位能指出我的错误,大家一起学习一起进步。

 

物联沃分享整理
物联沃-IOTWORD物联网 » 深入学习STM32F103C8T6的GPIO控制

发表评论