STM32 GPIO设置

发布者:风清扬yx最新更新时间:2016-10-08 来源: eefocus关键字:STM32  GPIO设置 手机看文章 扫描二维码
随时随地手机看文章
STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出)

① 浮空输入_IN_FLOATING

② 带上拉输入_IPU  

③ 带下拉输入_IPD           

④ 模拟输入_AIN
⑤ 开漏输出_OUT_OD     

⑥ 推挽输出_OUT_PP

⑦ 复用功能的推挽输出_AF_PP

⑧ 复用功能的开漏输出_AF_OD

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

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

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

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

1.2         GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度

配置无意义。

1.3         在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空

输入模式。

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

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

 

2           在STM32中如何配置片内外设使用的IO端口

首先,一个外设经过 ①配置输入的时钟和 ②初始化后即被激活(开启);③如果使用该外设的输入输出管脚,则需要配置相应的GPIO端口(否则该外设对应的输入输出管脚可以做普通GPIO管脚使用);④再对外设进行详细配置。

对应到外设的输入输出功能有下述三种情况:
一、外设对应的管脚为输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。
二、外设对应的管脚为输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。
三、ADC对应的管脚:配置管脚为模拟输入。

如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。将管脚配置成复用输出功能后,如果外设没有被激活,那么它的输出将不确定。

 

3           通用IO端口(GPIO)初始化:

3.1            GPIO初始化

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

3.1.2       RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C,

DISABLE):释放GPIO复位

3.2            配置各个PIN端口(模拟输入_AIN、输入浮空_IN_FLOATING、输入上拉_IPU、输入下拉_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP、推挽式复用输出_AF_PP、开漏复用输出_AF_OD)

3.3            GPIO初始化完成

 

=======================================================================

最近刚开始学习STM32,所以从最基本的GPIO开始学起;首先看看STM32的datasheet上对GPIO口的简单介绍:每个GPI/O 端口有两个32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32 位置位/复位寄存器(GPIOx_BSRR),一个16 位复位寄存器(GPIOx_BRR)和一个32 位锁定寄存器(GPIOx_LCKR)。

   GPIO 端口的每个位可以由软件分别配置成多种模式。每个I/O 端口位可以自由编程,然而I/0 端口寄存器必须按32 位字被访问(不允许半字或字节访问)。GPIOx_BSRR 和GPIOx_BRR 寄存器允许对任何GPIO 寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ 时不会发生危险。

端口位配置 CNFx[1:0]=xxb,MODEx[1:0]=xxb

再看GPIO功能很强大:

1.通用I/O(GPIO):最最基本的功能,可以驱动LED、可以产生PWM、可以驱动蜂鸣器等等;

2.单独的位设置或位清除:方便软体作业,程序简单。端口配置好以后只需GPIO_SetBits(GPIOx, GPIO_Pin_x)就可以实现对GPIOx的pinx位为高电平;

3.外部中断/唤醒线:端口必须配置成输入模式时,所有端口都有外部中断能力;

4.复用功能(AF):复用功能的端口兼有IO功能等。复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式:(CNFx[1:0]=01b,

MODEx[1:0]=00b)。

5.软件重新映射I/O复用功能:为了使不同器件封装的外设I/O 功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成。这时,复用功能就不再映射到它们的原始引脚上了

6.GPIO锁定机制:当在一个端口位上执行了所定(LOCK)程序,在下一次复位之前,将不能再更改端口位的配置。

 

GPIO基本设置

GPIOMode_TypeDef GPIO mode    定义及偏移地址

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    //推挽复用

GPIO输入输出速度选择:

typedef enum

{

GPIO_Speed_10MHz = 1,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

}

GPIOSpeed_TypeDef;

 

#define IS_GPIO_SPEED(SPEED) ((SPEED == GPIO_Speed_10MHz) ||

(SPEED == GPIO_Speed_2MHz) || (SPEED == GPIO_Speed_50MHz))

做一个GPIO输出的试验

当I/O 端口被配置为推挽模式输出时:输出寄存器上的0 激活N-MOS,而输

出寄存器上的1 将激活P-MOS。

用这段程序实现:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

int main(void)

{

#ifdef DEBUG

debug();

#endif

 

/* 设置系统时钟 */

RCC_Configuration();

   

/* 嵌套中断设置*/

NVIC_Configuration();

 

/* 激活GPIOC clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

 

/* Configure PC.04, PC.05, PC.06 and PC.07 as Output push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 |

GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOC, &GPIO_InitStructure);

 

while (1)

{

    /*本试验仅能实现LED1亮、熄功能*/

    GPIO_SetBits(GPIOC, GPIO_Pin_4); //设置PC.04 pin为高电平,点亮

LED1

    Delay();

    GPIO_ResetBits(GPIOC, GPIO_Pin_4); //设置PC.04 pin为低电平,熄灭

LED1

    Delay();

}

}

做一个GPIO输入的试验:以EK-STM32F中LCDdemo做例子

这个试验中把GPIO的PD.04做为按键输入,当下降沿来临时触发。

LCDdemo中的例程如下:首先配置按键PD.03, PD.04为按键输入接口。

void Button_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

 

/* Enable GPIOD clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

 

/* Configure PD.03, PD.04 as output push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);

}

下面为按键作用是启动外部中断

GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);

 

EXTI_InitStructure.EXTI_Line = EXTI_Line3;            //设定外部中断3

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设定中断模式

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设定下降沿触

发模式

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

 

/*******************************************************************************

设置GPIO基本参数

*******************************************************************************/

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

//根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4| GPIO_Pin_5 ;

//设置的IO为pin4与pin5

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

/* GPIO_Speed 描述

GPIO_Speed_10MHz 最高输出速率10MHz

GPIO_Speed_2MHz 最高输出速率2MHz

GPIO_Speed_50MHz 最高输出速率50MHz

*/

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;

/*

GPIO_Speed 描述

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 复用推挽输出通常有5种方式使用某个引脚功能,

它们的配置方式如下:

1)作为普通GPIO输入:

根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,

同时不要使能该引脚对应的所有复用功能模块。

2)作为普通GPIO输出:

根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引

脚对应的所有复用功能模块。

3)作为普通模拟输入:

配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有

复用功能模块。

4)作为内置外设的输入:

根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,

同时使能该引脚对应的某个复用功能模块。

5)作为内置外设的输出:

根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能

该引脚对应的所有复用功能模块。1、模拟输入模式下,是用于AD输入时输入模拟量,此时施密特触

发器输入关闭,施密特触发器输出为0.

2、下拉输入:打开内部下拉电阻

3、上拉输入:打开内部上拉电阻

4、浮空输入 :这个输入模式,输入电平必须由外部电路确定,

要根据具体电路,加外部上拉电阻或下拉电阻。

5、推挽输出:可以输出高,低电平,连接数字器件。推挽式输出输出电阻

小,带负载能力强。

6、开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要

上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强

(一般20ma以内).能驱动大电流和大电压。LED就使用这种模式

7、复用是指该引脚打开remap功能。*/

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource4);

EXTI_InitTypeDef EXTI_InitStructure;

EXTI_InitStructure.EXTI_Line=EXTI_Line4;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);

EXTI_InitTypeDef EXTI_InitStructure;

EXTI_InitStructure.EXTI_Line=EXTI_Line5;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);

}

/*GPIO常使用的几条函数

GPIO_ReadInputDataBit 读取指定端口管脚的输入

u8 ReadValue;

ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);

使用setbits 与resetbits 是比较简单,其实还是可以使用

其它函数。例如可以使用GPIO_WriteBit

GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);

GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);对于好像流水灯呀这些一个整段IO,可以使用

GPIO_Write(GPIOA, 0x1101);GPIO_EXTILineConfig 选择GPIO管脚用作外部中断线路

GPIO_EXTILineConfig(GPIO_PortSource_GPIOB, GPIO_PinSource8);*/

关键字:STM32  GPIO设置 引用地址:STM32 GPIO设置

上一篇:STM32 固件库中RCC_GetClocksFreq()函数注意事项
下一篇:STM32F4入手调试USART,ADC-DMA

推荐阅读最新更新时间:2024-03-16 15:14

stm32舵机驱动程序分享
  STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按内核架构分为不同产品:   其中STM32F系列有:   STM32F103“增强型”系列   STM32F101“基本型”系列   STM32F105、STM32F107“互联型”系列   增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,相当于0.5mA/MHz。
[单片机]
stm32.cube(五)——HAL.RCC
一、RCC特性 1.1 HIS内部高速时钟 HIS 时钟信号通过一个 8MHz 的 RC 振荡器产生,上电复位时,被自动选做系统时钟。但由于HIS的稳定性较差,受温度、电压等环境参数影响较大,一般只作为备用时钟使用。在芯片初始化的startup.s里,通常会调用一个c编写的函数system_init(),里面会将系统时钟源从HIS设置成HSE。 1.2 HSE外部高速时钟 由晶振或者外部时钟源提供的时钟,较为稳定。 1.3 PLL PLL可用于将 HIS RC 振荡器的输出时钟频率倍频,具体的原理要参考锁相环电路的相关知识。 1.4 LSE外部低速时钟 LSE 振荡器是一个 32.768kHz 的低速外部晶体或者陶瓷共振器
[单片机]
一文教会你STM32使用内部振荡器及其和外部晶体振荡器的区别和STM32L031性能分析和比较
在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法 如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法: 2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。 2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出‘0’。此方法可以减小功耗并(相对上面 首先要明确的是STM32没有内部晶振,HSI是内部RC振荡器。 HSI内部8MHz的RC振荡器的误差在1%左右 内部RC振荡器的精度通常比用HSE(外部晶振
[单片机]
一文教会你<font color='red'>STM32</font>使用内部振荡器及其和外部晶体振荡器的区别和STM32L031性能分析和比较
有关STM32外设配置的几个常见问题
在做STM32开发应用的过程中,常常会遇到这样那样的问题,其中相当部分问题是与各外设及相关GPIO的配置有关的。就这方面的问题,这里一起总结交流下。 目前的STM32芯片是基于ARM内核的可编程微处理器,我们可以简单地把内核以外的东西统称为外设,比方 TIMER、UART、SPI、USB、I2C、存储器等功能模块。以32F427芯片功能框图为例,那些红圈上的都是。 好,我们直接切入主题。围绕外设的配置,我们遇到的问题,大致可以分为两大类。 一、时钟问题,就这方面的问题又可以细分为几小点。 1.1 时钟没打开就使用。 这个不难理解,就是相关外设的时钟没有打开。比如UART5的时钟没有打开,SPI的时钟没打开
[单片机]
有关<font color='red'>STM32</font>外设配置的几个常见问题
STM32驱动LCD原理
TFTLCD即薄膜晶体管液晶显示器。它与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。 ▲驱动流程 01、使用FSMC驱动LCD 关于FSMC,把数据写入相应的地址,FSMC就会把地址从FSMC_A出去,写入的数据会会从FSMC_D发出去。至于片选等信号线都是自动的。读的话,直接读相应的地址,就会拿到改地址上的数据。 FSMC驱动外部SRAM时,外部SRAM的控制一般有: 地址线(如A0~A25) 数据线(如D0~D15) 写信号(WE,即WR) 读信号(OE,即
[单片机]
<font color='red'>STM32</font>驱动LCD原理
一个关于STM32 CAN出错恢复的话题
最近有个STM32 用户咨询: 最近在使用stm32f105做双can通信,can驱动芯片使用的TJA1042,发现将canH canL 短路再放开以后,can出错恢复不回来?之前在K40上使用的时候没有这个问题,不知道这个情况大家有什么指导建议啊? 另外,他还附上了基于STM32CUBEMX工具配置的相关代码如下: hcan1.Instance = CAN1; hcan1.Init.Prescaler = 2; hcan1.Init.Mode = CAN_MODE_NORMAL; hcan1.Init.SJW = CAN_SJW_1TQ; hcan1.Init.BS1 = CAN_BS1_8TQ; hc
[单片机]
一个关于<font color='red'>STM32</font> CAN出错恢复的话题
单片机stm32你了解多少
stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm32的视频资料便于学习参考。 什么是串口 UART : Universal Asynchronous Receiver/Transmitter 通用异步收发器 USART : Universal Synchronous Asynchronous Receiver/Transmitter 通用同步/异步收发器 一种是常用也是最简单的串行数据传输协议。数据线只需要两根就可以实现全双工。 Tx: 发送数据线 Rx: 接收数据线 A B TX
[单片机]
STM32中电源各引脚说明分析
一、数字电路中,电源符号 VCC:C=circuit,表示电路的意思,即接入电路的电压; VDD:D=Device,表示器件的意思,即器件的工作电压; VSS:S=Series,表示公共连接的意思,通常指电路公共接地端电压。 总结来说,VCC接电路的电源(±),VSS接电路的地,VDD接器件的电源引脚(±)。 二、STM32中电源各引脚说明 VDDA:A=Analog,表示模拟的意思,所以就是表示模拟器件的工作电压; VSSA:表示模拟器件的公共端地。 VBAT:给后备区域供电,维持包括RTC/BKP寄存器等在内的一些数据的保存。 100引脚的封装中: VREF-:A/D的参考,当需要使用时,必须绑定到VSSA(使得所有模拟器
[单片机]
<font color='red'>STM32</font>中电源各引脚说明分析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved