基于ARM开发板从零开始学习STM32 02-GPIO操作解析以及点亮LED

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/huolu0602/article/details/102508284

    GPIO的输入输出是我们控制一些开关,获取数据的基本。简单的剖析一个小系统,点亮LED灯,就是将引脚进行0,1操作,这只是一个简单的GPIO操作,我们只要再加一些操作,给它加个定时器或中断,可以闪光了,或者将IO改个模拟量输出,采用PWM(脉冲宽度调制)控制输出模拟电压,从而就可以随意控制LED的亮度。这个实例告诉我们,只要GPIO操作够熟练,做出的花样也就越多。

下面介绍一下GPIO。首先,GPIO有八种工作模式:

(1).GPIO_Mode_AIN  模拟输入:IO作为输入接口,输入为可变化值,接收外部模拟信号。

(2).GPIO_Mode_IN_FLOATING  浮空输入:复位上电时,不确定引脚的电平的高低

(3).GPIO_Mode_IPD  下拉输入:通用输入接口,只有0和1,强制下拉,一般为了输入强低电平。

(4).GPIO_Mode_IPU  上拉输入:通用输入接口,强制上拉,一般为了输入强高电平。

(5).GPIO_Mode_Out_OD  开漏输出:要得到高电平需要上拉电阻,作为电流型驱动。

(6).GPIO_Mode_Out_pp  推挽输出:输出0为接GND,输出1为接VCC。

(7).GPIO_Mode_AF_OD  复用开漏输出:一般为串口,I2C,SPI复用引脚,高电平需要上拉电阻。

(8).GPIO_Mode_AF_PP  复用推挽输出:一般为串口,I2C,SPI复用引脚,输出0,则一定为0,输出1,一定为1。

主要大致为高阻输入、推挽输出、开漏输出。

   1.高阻输入

为减少信息传输线的数目,大多数计算机中的信息传输线采用总线形式,即凡要传输的同类信息都在同一组传输线,且信息是分时传送的。在计算机中一般有三组总线,即数据总线、地址总线和控制总线。为防止信息相互干扰,要求凡挂到总线上的寄存器或存储器等,它的输入输出端不仅能呈现 0、1 两个信息状态,而且还应能呈现第三个状态----高阻抗状态,即该引脚的输出是受控制的,高阻态保证当前总线可有其他器件占用。这种输入模式一般是由一个带有施密特触发输入的三态缓冲器,并具有很高的输入等效阻抗。施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。执行 GPIO 管脚读操作时,在读脉冲的作用下会把管脚的当前电平状态读到内部总线上。在不执行读操作时,外部管脚与内部总线之间是隔离的。

    2.推挽输出

推挽输出原理:在功率放大器电路中大量采用推挽放大器电路,这种电路中用两只三极管构成一级放大器电路,两只三极管分别放大输入信号的正半周和负半周,即用一只三极管放大信号的正半周,用另一只三极管放大信号的负半周,两只三极管输出的半周信号在放大器负载上合并后得到一个完整周期的输出信号。

   3.开漏输出

开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到 GND(有一定内阻)。回读功能:读到的仍是输出锁存器的状态,而不是外部管脚 Pin 的状态。因此开漏输出模式是不能用来输入的。开漏输出结构没有内部上拉,因此在实际应用时通常都要外接合适的上拉电阻(通常采用 4.7~10kΩ)。开漏输出能够方便地实现“线与”逻辑功能,即多个开漏的管脚可以直接并在一起(不需要缓冲隔离)使用,并统一外接一个合适的上拉电阻,就自然形成“逻辑与”关系。开漏输出的另一种用途是能够方便地实现不同逻辑电平之间的转换(如 3.3V 到 5V 之间),只需外接一个上拉电阻,而不需要额外的转换电路。典型的应用例子就是基于开漏电气连接的 I2C 总线。

 

推挽输出与开漏输出有什么区别?

推挽输出可以输出高,低电平,连接数字器件;开漏输出的输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。

开漏模式:输出 0  时,N-MOS  导通,P-MOS  不被激活,输出0 。输出 1  时,N-MOS  高阻, P-MOS  不被激活,输出1 (需要外部上拉电路);此模式可以把端口作为双向 IO  使用。

推挽模式:输出 0  时,N-MOS  导通,P-MOS  高阻  ,输出 0。 输出 1  时,N-MOS  高阻,P-MOS  导通,输出 1(不需要外部上拉电路)。(不需要外部上拉电路)。简单来说开漏是 0 的时候接 GND 1 的时候浮空 推挽是 0 的时候接GND 1 的时候接 VCC。

I/O 口的输出模式下,有 3 种输出速度可选(2MHz、10MHz和 50MHz),这个速度是指 I/O 口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在 I/O 口 的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声 控制和降低功耗的目的。驱动电路的频率越高,所产生的噪声也就越大。当然不是频率越低越好,当电路对高频有要求时还是要选用高频,当选用的频率不够时,很可能会得到失真的输出信号。

关键是 GPIO 的引脚速度跟应用匹配,例如:

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

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

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

需要注意几点:GPIO 口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。在复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式。所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。GPIO 口的配置具有上锁功能,当配置好 GPIO 口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。

STM32选用IO模式

(1) 浮空输入_IN_FLOATING—浮空输入,可以做 KEY 识别,RX1。

(2 )带上拉输入_IPU—IO  内部上拉电阻输入。

(3)带下拉输入_IPD—IO 内部下拉电阻输入。

(4) 模拟输入_AIN—应用 ADC 模拟输入,或者低功耗下省电。

(5)开漏输出_OUT_OD—IO 输出 0 接 GND,IO 输出 1,悬空需要外接上拉电阻,才能实现输出高电平。当输出为 1 时,IO 口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样 IO 口也就可以由外部电路改变为低电平或不变 。可以读 IO 输入电平变化,

实现 C51 的 IO 双向功能。

(6)推挽输出_OUT_PP—IO 输出 0接 GND, IO 输出 1 -接 VCC,读输入值是未知的。

(7)复用功能的推挽输出_AF_PP—片内外设功能(I2C 的SCL,SDA)。

(8)复用功能的开漏输出_AF_OD—片内外设功能(TX1,MOSI,MISO.SCK.SS)。

之前做过有低功耗需求的项目,在STOP或STAYBY情况下,将所有的IO都设置为模拟输入,这样可以得到尽量低的功耗。

最后,基本上介绍完了GPIO的所有模式,下面是一个基础的STM32流水灯操作的实例。

下面是对GPIO引脚的初始化、延时函数以及流水灯程序代码

​
void LedInit ()
{
GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA |  RCC_APB2Periph_GPIOC, ENABLE);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;		
	GPIO_Init(GPIOA, &GPIO_InitStructure);	 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;		
	GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void delay(void)
{
	u32 cnt;
	for(cnt=1000000;cnt>0;cnt--);
}

void LedTest(void)
{
	IsLed1On(1);
	delay();
	IsLed2On(1);
	delay();
	IsLed3On(1);
	delay();
	IsLed4On(1);
	delay();
	IsLed1On(0);
	delay();
	IsLed2On(0);
	delay();
	IsLed3On(0); 
	delay();
	IsLed4On(0);
	delay();	
}

​

上述工程在我网盘链接:https://pan.baidu.com/s/1bI4VuNvic_Q8jPgOOiD3kA 提取码:yzv8 ,有需要的可以自行下载。重点不在于结果,结果固然重要,但理解整个过程才是关键。

猜你喜欢

转载自blog.csdn.net/huolu0602/article/details/102508284