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);*/