历史上的今天
返回首页

历史上的今天

今天是:2024年12月21日(星期六)

2020年12月21日 | STM32学习笔记-GPIO使用超强总结

2020-12-21 来源:eefocus

1 GPIO使用步骤

1.1. 使能GPIO对应的外设时钟

例如://使能GPIOA、GPIOB、GPIOC对应的外设时钟


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB |

RCC_APB2Periph_GPIOC , ENABLE);


1.2. 声明一个GPIO_InitStructure结构体


例如:


GPIO_InitTypeDef GPIO_InitStructure;


1.3. 选择待设置的GPIO管脚


例如://选择待设置的GPIO第7、8、9管脚位 ,中间加“|”符号


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 |GPIO_Pin_8 | GPIO_Pin_9;


1.4. 设置选中GPIO管脚的速率


例如://设置选中GPIO管脚的速率为最高速率2MHz


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//最高速率2MHz


1.5. 设置选中GPIO管脚的模式


例如://设置选中GPIO管脚的模式为开漏输出模式


GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_OD;

//开漏输出模式


1.6. 根据GPIO_InitStructure中指定的参数初始化外设GPIOX


例如:


 GPIO_Init(GPIOC,&GPIO_InitStructure);


1.7.其他应用


例: 将端口GPIOA的第10、15脚置1(高电平)


GPIO_SetBits(GPIOA,GPIO_Pin_10| GPIO_Pin_15);


例:将端口GPIOA的第10、15脚置0(低电平)


GPIO_ResetBits(GPIOA,GPIO_Pin_10| GPIO_Pin_15);


2. GPIO操作说明


2.1 库函数: 函数GPIO_DeInit


功能描述:将外设GPIOx寄存器重设为缺省值

例:


GPIO_DeInit(GPIOA);


2.2 函数GPIO_AFIODeInit


功能描述:将复用功能(重映射事件控制和EXTI设置)重设为缺省值

例:


GPIO_AFIODeInit();


2.3 函数GPIO_Init


功能描述:根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器


例:


GPIO_InitTypeDefGPIO_InitStructure; 


GPIO_InitStructure.GPIO_Pin= GPIO_Pin_All;

 


GPIO_InitStructure.GPIO_Speed=

GPIO_Speed_10MHz; 


GPIO_InitStructure.GPIO_Mode=

GPIO_Mode_IN_FLOATING;  


GPIO_Init(GPIOA,&GPIO_InitStructure);


2.3.1 GPIO_InitTypeDefstructure


GPIO_InitTypeDef定义于文件“stm32f10x_gpio.h”:


typedef struct  {


u16GPIO_Pin;


GPIOSpeed_TypeDefGPIO_Speed;  


GPIOMode_TypeDefGPIO_Mode;

 


}GPIO_InitTypeDef;


2.3.2 GPIO_Pin


该参数选择待设置的GPIO管脚,使用操作符“|”可以一次选中多个管脚。可以使用下表中的任意组合。


GPIO_Pin_None:     无管脚被选中  


GPIO_Pin_x:          选中管脚x(0--15)


GPIO_Pin_All:        选中全部管脚


2.3.3 GPIO_Speed


用以设置选中管脚的速率。


GPIO_Speed_10MHz: 最高输出速率10MHz 


GPIO_Speed_2MHz:  最高输出速率2MHz


GPIO_Speed_50MHz: 最高输出速率50MHz


2.3.4 GPIO_Mode


用以设置选中管脚的工作状态。


GPIO_Mode_AIN:        模拟输入


GPIO_Mode_IN_FLOATING:    浮空输入  


GPIO_Mode_IPD:         下拉输入


GPIO_Mode_IPU:           上 拉输入


GPIO_Mode_Out_OD:           开漏输出


GPIO_Mode_Out_PP:            推挽输出 


GPIO_Mode_AF_OD:            复用开漏输出  


GPIO_Mode_AF_PP:            复用推挽输出


2.4 函数GPI


O_StructInit


功能描述:把GPIO_InitStruct中的每一个参数按缺省值填入 例:


GPIO_InitTypeDefGPIO_InitStructure;  


GPIO_StructInit(&GPIO_InitStructure); 


GPIO_InitStruct:


GPIO_Pin:GPIO_Pin_All  


GPIO_Speed:GPIO_Speed_2MHz 


GPIO_Mode:GPIO_Mode_IN_FLOATING


2.5 函数GPIO_ReadInputDataBit


功能描述:读取指定端口管脚的输入


例:


u8ReadValue;


ReadValue= GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);


2.6 函数GPIO_ReadInputData


功能描述:读取指定的GPIO端口输入


例:


u16ReadValue;


ReadValue= GPIO_ReadInputData(GPIOC);


2.7 函数GPIO_ReadOutputDataBit


功能描述:读取指定端口管脚的输出


例:


u8ReadValue;


ReadValue= GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7);


2.8 函数GPIO_ReadOutputData


功能描述:读取指定的GPIO端口输出


例:


u16ReadValue;


ReadValue= GPIO_ReadOutputData(GPIOC);


2.9 函数GPIO_SetBits


功能描述:置位指定的数据端口位


例:将端口GPIOA的第10、15脚置1(高电平)


GPIO_SetBits(GPIOA,GPIO_Pin_10 | GPIO_Pin_15);


2.10 函数GPIO_ResetBits


功能描述:清除指定的数据端口位


例:将端口GPIOA的第10、15脚置0(低电平)


GPIO_ResetBits(GPIOA,GPIO_Pin_10 | GPIO_Pin_15);


2.11 函数GPIO_WriteBit


功能描述:设置或者清除指定的数据端口位


例:


GPIO_WriteBit(GPIOA,GPIO_Pin_15, Bit_SET);


2.12 函数GPIO_Write


功能描述:向指定GPIO数据端口写入数据


例:


GPIO_Write(GPIOA,0x1101);


2.13 函数GPIO_PinLockConfig


功能描述:锁定GPIO管脚设置寄存器


例:


GPIO_PinLockConfig(GPIOA,GPIO_Pin_0|GPIO_Pin_1);


2.14 函数GPIO_EventOutputConfig


功能描述:选择GPIO管脚用作事件输出 例:


GPIO_EventOutputConfig(GPIO_PortSourceGPIOE,GPIO_PinSource5);


GPIO_PortSource


GPIO_PortSource用以选择用作事件输出的GPIO端口。


2.15 函数GPIO_EventOutputCmd


功能描述:使能或者失能事件输出 例:


GPIO_EventOutputConfig(GPIO_PortSourceGPIOC,GPIO_PinSource6);

GPIO_EventOutputCmd(ENABLE);


2.16 函数GPIO_PinRemapConfig


功能描述:改变指定管脚的映射例:


GPIO_PinRemapConfig(GPIO_Remap_I2C1,ENABLE);


一.GPIO概述


共有8种模式


可以通过编程选择:


浮空输入


带上拉输入


带下拉输入


模拟输入


开漏输出——(此模式可实现hotpower说的真双向IO)


推挽输出


复用功能的推挽输出


复用功能的开漏输出


模式7和模式8需根据具体的复用功能决定。


2、专门的寄存器(GPIOx_BSRR和GPIOx_BRR)实现对GPIO口的原子操作,即回避了设置或清除I/O端口时的“读-修改-写”操作,使得设置或清除I/O端口的操作不会被中断处理打断而造成误动作。


3、每个GPIO口都可以作为外部中断的输入,便于系统灵活设计。


4、I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这有利于噪声控制。这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。


4.1各种接口的措施


4.1.1对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。


4.1.2对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。


4.1.3对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。


4.2 GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。


4.3 在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。


4.4 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。


4.5 GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。


5、所有I/O口兼容CMOS和TTL,多数I/O口兼容5V电平。


6、大电流驱动能力:GPIO口在高低电平分别为0.4V和VDD-0.4V时,可以提供或吸收8mA电流;如果把输入输出电平分别放宽到1.3V和VDD-1.3V时,可以提供或吸收20mA电流。


7、具有独立的唤醒I/O口。


8、很多I/O口的复用功能可以重新映射。


9、GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些I/O口的配置被改变而损坏——如一个输入口变成输出口并输出电流。


二.推挽结构


一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.要实现线与需要用OC(opencollector)门电路 .如果输出级的有两个三极管,始终处于一个导通、一个截止的状态,也就是两个三级管推挽相连,这样的电路结构称为推拉式电路或图腾柱(Totem- pole)输出电路(可惜,图无法贴上)。当输出低电平时,也就是下级负载门输入低电平时,输出端的电流将是下级门灌入T4;当输出高电平时,也就是下级负载门输入高电平时,输出端的电流将是下级门从本级电源经 T3、D1 拉出。这样一来,输出高低电平时,T3 一路和 T4 一路将交替工作,从而减低了功耗,提高了每个管的承受能力。又由于不论走哪一路,管子导通电阻都很小,使RC常数很小,转变速度很快。因此,推拉式输出级既提高电路的负载能力,又提高开关速度。供你参考。


推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小效率高。


输出既可以向负载灌电流,也可以从负载抽取电流


三.开漏电路


在电路设计时我们常常遇到开漏(open

drain)和开集(open collector)的概念。所谓开漏电路概念中提到的“漏”就是指MOSFET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOSFET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。


组成开漏形式的电路有以下几个特点:


利用 外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。


可以将多个开漏输出的Pin,连接到一条线上。形成 “与逻辑” 关系。如图1,当PIN_A、PIN_B、PIN_C任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。


可以利用改变上拉电源的电压,改变传输电平。如图2, IC的逻辑电平由电源Vcc1决定,而输出高电平则由Vcc2决定。这样我们就可以用低电平逻辑控制输出高电平逻辑了。


开漏Pin不连接外部的上拉电阻,则只能输出低电平(因此对于经典的51单片机的P0口而言,要想做输入输出功能必须加外部上拉电阻,否则无法输出高电平逻辑)。


标准的开漏脚一般只有输出的能力。添加其它的判断电路,才能具备双向输入、输出的能力。


应用中需注意:


开漏和开集的原理类似,在许多应用中我们利用开集电路代替开漏电路。例如,某输入Pin要求由开漏电路驱动。则我们常见的驱动方式是利用一个三极管组成开集电路来驱动它,即方便又节省成本。如图3。


上拉电阻R pull-up的 阻值 决定了 逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小。反之亦然。


Push-Pull输出就是一般所说的推挽输出,在CMOS电路里面应该较CMOS输出更合适,应为在CMOS里面的push-pull输出能力不可能做得双极那么大。输出能力看IC内部输出极N管P管的面积。和开漏输出相比,push-pull的高低电平由IC的电源低定,不能简单的做逻辑操作等。 push-pull是现在CMOS电路里面用得最多的输出级设计方式。 at91rm9200

GPIO 模拟I2C接口时注意!!


推荐阅读

史海拾趣

Decawave公司的发展小趣事

随着UWB技术的不断发展和应用领域的不断扩展,Decawave不断丰富和完善其产品和解决方案。除了UWB芯片外,公司还推出了与UWB芯片兼容的模块和开发工具,以及针对特定应用场景的解决方案。这些产品和解决方案不仅满足了客户的不同需求,也进一步巩固了Decawave在UWB技术领域的领先地位。

DURABLE公司的发展小趣事

面对电子行业的快速变化和技术更新,DURABLE公司始终保持着敏锐的洞察力和创新精神。公司不断加大对新技术和新产品的研发力度,积极探索物联网、人工智能等前沿技术在电子行业的应用。通过一系列的技术创新和产品升级,DURABLE成功实现了从传统电子材料供应商向智能电子解决方案提供商的转型升级。这一转型不仅提升了公司的核心竞争力,还为公司的未来发展奠定了坚实基础。

Hammond公司的发展小趣事

随着环保意识的日益增强,DURABLE公司积极响应全球绿色发展的号召,将环保理念融入产品研发和生产过程中。公司投入大量资金用于研发环保型电子材料,并成功推出了一系列具有环保性能的产品。这些产品不仅满足了市场对环保产品的需求,还为公司赢得了良好的社会声誉。同时,DURABLE还积极推广绿色生产和循环经济理念,为电子行业的可持续发展做出了积极贡献。

比亚迪(BYD)公司的发展小趣事

比亚迪的发展可以追溯到1995年,当时王传福创立了这家公司,最初专注于生产小型电池。在初创期,比亚迪通过模仿日本三洋和索尼的产品快速积累了生产经验。然而,王传福深知模仿不是长久之计,因此他果断地决定转向自主研发和创新。这一决策在日后证明是极其明智的。随着技术的不断积累,比亚迪于1997年开始量产锂离子电池,并成功实现了年销售额突破1亿元。这一里程碑标志着比亚迪在电池技术领域取得了重大突破,为其日后在电子行业的发展奠定了坚实基础。

Comtronic Gmbh-Verbindungstechnik公司的发展小趣事

近年来,比亚迪在电子行业的发展进入了新的阶段。为了巩固和扩大国内市场的发展优势,同时加速海外布局,比亚迪开始实施多品牌策略。通过推出不同定位、不同价格区间的产品系列,比亚迪满足了更多消费者的需求。同时,比亚迪还积极推进本地化生产进程,在海外设立生产基地,提高生产效率和降低成本。这些举措不仅提升了比亚迪在全球市场的竞争力,也为其未来的可持续发展奠定了坚实基础。

这些故事展示了比亚迪在电子行业中的发展历程和关键节点,从电池技术的突破、进军海外市场、新能源汽车转型、品牌形象更新到多品牌策略的实施,都体现了比亚迪不断创新、追求卓越的精神。

GigPeak公司的发展小趣事

GigPeak公司自成立之初,便专注于高速数据传输技术的研发。在2005年,公司研发团队成功开发出一种新型的光电转换器,该转换器能够在极低的功耗下实现前所未有的数据传输速率。这一技术创新迅速吸引了业界的关注,并成功应用于多个高端数据中心项目,帮助GigPeak在竞争激烈的市场中脱颖而出。随着技术的不断迭代和市场的广泛认可,GigPeak逐渐成为了高速数据传输领域的领军企业。

问答坊 | AI 解惑

以集成化的车用软件平台应对汽车业的软件危机

如今,汽车制造业已经与软件结下了不解之缘。不仅如此,汽车制造业已经深陷于软件危机之中。问题不是出在汽车制造业,这种软件危机只不过是设备软件产业本身所面临压力的间接反映而已。如今,新产品能够获得的市场窗口期非常狭窄,而功能上的复 ...…

查看全部问答>

求助,只有在一个电压完全建立后,才对外输出电压的这种电路叫什么?

只有在一个电压完全建立后,才对外输出电压的这种电路叫什么?…

查看全部问答>

电容式触摸按键

silicon labs 电容式触摸按键解决方案 RELEVANT DEVICES The concepts and example code in this application note are applicable to the following device families: C8051F30x, C8051F31x, C8051F320/1, C8051F33x, C8051F34x, C8051F35x, C8 ...…

查看全部问答>

【藏书阁】数字电子技术电子教案

第1章 数字电子技术基础 119页.ppt 第2章 组合逻辑电路 136页.ppt 第3章 时序逻辑电路 171页.ppt 第4章 脉冲信号的产生与整形 46页.ppt 第5章 数模和模数转换 29页.ppt 数字电子技术.ppt…

查看全部问答>

Cyclone III FPGA开发板详细电路图

Cyclone III FPGA开发板详细电路图.…

查看全部问答>

2440,bootloader问题

我的bsp里面有stepldr和eboot, 我想让eboot跑起来, 但把stepldr.nb1烧写到flash中后,在dnw上显示的却是乱码!!!! 这个是串口的初始代码: void Uart_Init(void) {    int i;     rUFCON1 = 0x0;     ...…

查看全部问答>

问一个IP地址的路由问题(非独立IP)

现在的IP地址已经不够用了,但是依然可以使用非独立的IP地址来访问网络。 例如我的IP:10.15.1.79[mask:255.255.0.0],这个应该肯定不是独立IP了。 如果我要给外网发送一个IP报(140.252.0.1),可以判断是外网,就可以通过默认路由转发这个IP报。 ...…

查看全部问答>

WINCE6.0的文件路径问题

我想编个能创建文件的程序,用到了CFile类,但不知道该怎样设置路径,请大侠们详细的说说路径问题。对了我用的是SD卡启动,程序也放在SD卡里面。…

查看全部问答>

LPC111x的延时代码。

两个函数分别是微秒和毫秒的延时,精确度在5%以内。LPC1343应该不适合,毕竟M3不想M0,有流水。 void sleepUs(uint32_t us){         // 1us base on 12MHz = 2, 50MHz = 8;         uint32_t i = (us ...…

查看全部问答>

ADC12参考电压怎么选择,依据是什么?

请问版主和高手们: AD中的参考电压怎么选择,内部参考电压何时用2.5V和1.5V,ADC12MCTLx中的Sref位的参考电压源应该根据什么选择。对此我不明白,请懂的朋友给解释一下,谢谢了!!…

查看全部问答>