微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32开发板例程讲解之二:GPIO的描述和配置

STM32开发板例程讲解之二:GPIO的描述和配置

时间:11-27 来源:互联网 点击:

RCC->CFGR &= (uint32_t)0xFF80FFFF;

#ifdef STM32F10X_CL

//Reset PLL2ON and PLL3ON bits

RCC->CR &= (uint32_t)0xEBFFFFFF;

//Disable all interrupts and clear pending bits

RCC->CIR = 0x00FF0000;

// Reset CFGR2 register

RCC->CFGR2 = 0x00000000;

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)

// Disable all interrupts and clear pending bits

RCC->CIR = 0x009F0000;

//Reset CFGR2 register

RCC->CFGR2 = 0x00000000;

#else

// Disable all interrupts and clear pending bits

RCC->CIR = 0x009F0000;

#endif // STM32F10X_CL

#if defined (STM32F10X_HD) || (defined STM32F10X_XL)

#ifdef DATA_IN_ExtSRAM

SystemInit_ExtMemCtl();

#endif // DATA_IN_ExtSRAM

#endif

//配置系统时钟频率,HCLK, PCLK2和 PCLK1 的预分频

//配置Flash延迟周期,使能预存取缓冲区

SetSysClock();

}

再次总结一下GPIO的配置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//

(1)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B |C, ENABLE):使能APB2总线外设时钟

(2)RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):释放GPIO复位

GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;//50M时钟速度

//gpio A组中的哪些引脚,什么模式速度

typedefstruct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;

typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

typedef enum
{ GPIO_Mode_AIN =0x0,//模拟输入
GPIO_Mode_IN_FLOATING =0x04,//浮空输入
GPIO_Mode_IPD =0x28,//下拉输入
GPIO_Mode_IPU =0x48,//上拉输入
GPIO_Mode_Out_OD =0x14,//开漏输出
GPIO_Mode_Out_PP =0x10,//推挽输出
GPIO_Mode_AF_OD =0x1C,//开漏复用功能
GPIO_Mode_AF_PP =0x18//推挽复用功能
}GPIOMode_TypeDef;

库写的相当严谨 使用了枚举,也可见IO 的功能之多性能之强~!

GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化IO口配置结束。

附注1:PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时脉讯号,使内存能正确的存取资料。PLL用于振荡器中的反馈技术。许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步,利用锁相环路就可以实现这个目的。

附注2:STM32的GPIO口的输出:开漏输出和推挽输出

1、推挽输出与开漏输出的区别:

>>推挽输出:可以输出高,低电平,连接数字器件

>>开漏输出:输出端相当于三极管的集电极.要得到高电平状态需要上拉电阻才行.适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).

推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.
要实现 线与 需要用OC(open collector)门电路.是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出既可以向负载灌电流,也可以从负载抽取电流。

当端口配置为输出时:

开漏模式:输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。

输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路),也就是说此模式下只有N-MOS对输出起作用;此模式可以把端口作为双向IO使用。

推挽模式:输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。

输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。

简单来说,开漏是0的时候接GND ,1的时候浮空;推挽是0的时候接GND ,1的时候接VCC。

2、开漏电路特点及应用

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

组成开漏形式的电路有以下几个特点:
1)利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经Rpull-up,MOSFET到GND。IC内部仅需很下的栅极驱动电流。
2)可以将多个开漏输出的Pin,连接到一条线上。形成“与逻辑”关系。当PIN_A、PIN_B、PIN_C任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。
3)可以利用改变上拉电源的电压,改变传输电平。IC的逻辑电平由电源Vcc1决定,而输出高电平则由Vcc2决定。这样我们就可以用低电平逻辑控制输出高电平逻辑了。
4)开漏Pin不连接外部的上拉电阻,则只能输出低电平(因此对于经典的51单片机的P0口而言,要想做输入输出功能必须加外部上拉电阻,否则无法输出高电平逻辑)。
5)标准的开漏脚一般只有输出的能力。添加其它的判断电路,才能具备双向输入、输出的能力。

应用中需注意:
1)开漏和开集的原理类似,在许多应用中我们利用开集电路代替开漏电路。例如,某输入Pin要求由开漏电路驱动。则我们常见的驱动方式是利用一个三极管组成开集电路来驱动它,即方便又节省成本。
2)上拉电阻Rpull-up的阻值决定了逻辑电平转换的沿的速度。阻值越大,速度越低功耗越小。反之亦然。

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

3、什么是OC、OD

集电极开路门(集电极开路OC或源极开路OD)
open-drain是漏极开路输出的意思,相当于集电极开路(open-collector)输出,即ttl中的集电极开路(oc)输出。一般用于线或、线与,也有的用于电流驱动。
open-drain是对mos管而言,open-collector是对双极型管而言,在用法上没啥区别。
开漏形式的电路有以下几个特点:
1)利用外部电路的驱动能力,减少IC内部的驱动。或驱动比芯片电源电压高的负载.
2)可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。如果作为图腾输出必须接上拉电阻。接容性负载时,下降延是芯片内的晶体管,是有源驱动,速度较快;上升延是无源的外接电阻,速度慢。如果要求速度高电阻选择要小,功耗会大。所以负载电阻的选择要兼顾功耗和速度。
3)可以利用改变上拉电源的电压,改变传输电平。例如加上上拉电阻就可以提供TTL/CMOS电平输出等。
4)开漏Pin不连接外部的上拉电阻,则只能输出低电平。一般来说,开漏是用来连接不同电平的器件,匹配电平用的。
5)正常的CMOS输出级是上、下两个管子,把上面的管子去掉就是OPEN-DRAIN了。这种输出的主要目的有两个:电平转换和线与。
6)由于漏级开路,所以后级电路必须接一上拉电阻,上拉电阻的电源电压就可以决定输出电平。这样你就可以进行任意电平的转换了。
7)线与功能主要用于有多个电路对同一信号进行拉低操作的场合,如果本电路不想拉低,就输出高电平,因为OPEN-DRAIN上面的管子被拿掉,高电平是靠外接的上拉电阻实现的。(而正常的CMOS输出级,如果出现一个输出为高另外一个为低时,等于电源短路。)
8)OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。

4、什么是线或逻辑与线与逻辑?

在一个结点(线)上,连接一个上拉电阻到电源VCCVDDnNPNNMOS晶体管的集电极C或漏极D,这些晶体管的发射极E或源极S都接到地线上,只要有一个晶体管饱和,这个结点(线)就被拉到地线电平上.
因为这些晶体管的基极注入电流(NPN)或栅极加上高电平(NMOS),晶体管就会饱和,所以这些基极或栅极对这个结点(线)的关系是或非NOR逻辑.如果这个结点后面加一个反相器,就是或OR逻辑.

注:个人理解:线与,接上拉电阻至电源。(~A)&(~B)=~(A+B),由公式较容易理解线与此概念的由来

如果用下拉电阻和PNPPMOS管就可以构成与非NAND逻辑,或用负逻辑关系转换与/或逻辑.

注:线或,接下拉电阻至地。(~A)+(~B)=~(AB);
这些晶体管常常是一些逻辑电路的集电极开路OC或源极开路OD输出端.这种逻辑通常称为线与/线或逻辑,当你看到一些芯片的OCOD输出端连在一起,而有一个上拉电阻时,这就是线或/线与了,但有时上拉电阻做在芯片的输入端内.
顺便提示如果不是OCOD芯片的输出端是不可以连在一起的,总线BUS上的双向输出端连在一起是有管理的,同时只能有一个作输出,而其他是高阻态只能输入.

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

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top