STM32学习系列----STM32之GPIO

来源:互联网 发布:万达电商 淘宝别 编辑:程序博客网 时间:2024/04/29 16:21

STM32之GPIO

欢迎转载,转载请注明原作者

1.GPIO解释

GPIO英文全称是General-purpose input/ouput,即通用型输入输出,GPIO根据配置可以作为通用输入(GPI),通用输出(GPO)或是通用输入输出(GPIO)

2.GPIO工作模式

GPIO共有八种工作模式,其中包括4种输入模式和4种输出模式。其中输出模式有3种输出速率

输入模式

  • 上拉输入
  • 下拉输入
  • 浮空输入
  • 模拟输入

输入模式

1.上拉输入:配置为上拉输入模式时,内部上拉电阻连接;若无高低电平输入时,检测该管脚电平为高电平。

2.下拉输入:配置为下拉输入模式时,内部下拉电阻连接;若无高低电平输入时,检测该管脚电平为低电平。

3.浮空输入:配置为浮空输入模式时,内部上拉电阻与下拉电阻均不连接;若无高低电平输入时,检测该管脚电平未知。

4.模拟输入:配置为模拟输入模式时,输入信号不再经过TTL肖特基触发器1,直接输入到芯片内部检测,一般用于ADC等模拟量信号采集。
输出模式

  • 开漏输出
  • 推挽输出
  • 复用开漏输出
  • 复用推挽输出

输出模式

输出模式实质是两种模式,一是开漏输出,一是推挽输出

1.开漏输出:输出信号“0”时会激活N-MOS,N-MOS导通,输出管脚与VSS连通,输出低电平;输出信号“1”时不激活P-MOS,同时N-MOS也不导通,输出管脚为高阻态。因此一般开漏输出管脚与外部上拉电阻连接,输出信号“1”时管脚会被外部上拉电压钳高,该模式可以需要用于匹配电平的场合。

2.推挽输出:输出信号“0”时会激活N-MOS,N-MOS导通,输出管脚与VSS连通,输出低电平。输出信号“1”时会激活P-MOS,P-MOS导通,输出管脚与VDD连通,输出高电平电平。这个模式输出高低电平时会分别导通一个MOS管,既提高电路负载能力,又提高开关速度2。

3.复用开漏输出:实质上是和开漏模式一样,在GPIO复用功能时使用

4.复用推挽输出:实质上是和推挽模式一样,在GPIO复用功能时使用

输出速度

输出模式下,有3种输出速度可选(2MHz,10mHz和50MHz),这个速度是指IO口驱动电路的响应速度而不是输出信号的速度。通过选择速度来选择不同的驱动输出模块,达到最佳的噪声控制和降低功耗的目的。

高频信号输出会带来功耗增加和噪声增大;低频信号输出可能会带来信号失真,因此需要根据实际需要来选择合适的速度输出3。

3.GPIO配置寄存器

每个GPIO端口有7个寄存器,其中包括

-2个32位端口配置寄存器(CRL,CRH)
分别控制端口低8位和高8位的工作模式(即8种工作模式和输出速度):在这2个寄存器中每一管脚(Pin)有4bit对应:CNF[1]-CNF[0];MODE[1]-MODE[0]

MODE[1:0] 含义 00 输入模式 01 输出模式,最大速度10MHz 10 输出模式,最大速度2MHz 11 输出模式,最大速度50MHz
CNF[1:0] 输入模式 输出模式 00 模拟输入 通用推挽输出 01 浮空输入 通用开漏输出 10 上拉/下拉输入 复用推挽输出 11 保留 复用开漏输出

-32位端口输入数据寄存器(IDR)
低16位使用,这些位只读,而且只能以字(16bit)的形式读出,读出值对应管脚(Pin)状态。

-32位端口输出数据寄存器(ODR)
低16位使用,这些位可读可写,只能以字(16bit)的形式操作。

-32位端口设置/清除寄存器(BSRR)
低16位为设置位BSy,这些位只写,而且只能以字(16bit)的形式写入,写0不影响ODRy,写1设置对应ODRy为1;
高16位为清除位BRy,这些位只写,而且只能以字(16bit)的形式写入,写0不影响ODRy,写1设置对应ODRy为0。
如果同时设置了BSy和BRy的对应位,则BSy起作用

-32位端口清除寄存器(BRR)
低16位为清除位BSy,这些位只写,而且只能以字(16bit)的形式写入,写0不影响ODRy,写1设置对应ODRy为04;
-32位端口配置锁定寄存器(LCKR)
该寄存器用于锁定端口管脚
bit16是锁键位LCKK,该位为0代表锁键未激活,为1代表锁键已激活;锁键激活需要向锁键位写入特定的写入序列(写1->写0->写1->读0->读1)(最后一次读指令可以取消)
bit[0:15]为锁位LCKy,这些位可读可写,但只能在LCKK为0(锁键未激活)时写入,该位为0代表不锁定,为1代表锁定。

4.基于V3.5库函数的GPIO配置函数(野火开发板教程)

void GPIO_configuration(void){    //定义结构体    GPIO_InitTypeDef GPIO_InitStructure;    //开启端口C的时钟    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);    //选择需要控制的管脚    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;    //选择推挽输出模式    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //输出速度为50MHz    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //初始化GPIOC    GPIO_Init(GPIOC, &GPIO_InitStructure);            //置高各个管脚    GPIO_SetBits(GPIOC, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7);  }

  1. 肖特基触发器是一种阈值开关电路,具有突变输入——输出特性的门电路。这种电路被设计成阻止输入电压出现微小变化(低于某一阈值)而引起的输出电压的改变 ↩
  2. http://bbs.elecfans.com/infocenter.php?mod=space&uid=961328&do=blog&id=242993 ↩
  3. http://blog.csdn.net/dldw8816/article/details/51450833 ↩
  4. 既可以通过ODRy设置管脚(Pin),也可以通过BSy和BRy设置,但是通过ODRy设置管脚(Pin)需要首先读取保存ODRy数据,再进行设置管脚(Pin)在这个过程中有可能被中断影响—–引用http://www.cnblogs.com/shangdawei/p/4723941.html ↩
1 0
原创粉丝点击