GPIO:General Purpose Input Output (通用输入/输出)。
GPIO最经典应用:LED灯。
先看电路。声明:参考正点原子战舰开发板。
与LED串联的电阻称为限流电阻。
限流电阻计算公式:R=(U-LED压降)/20ma。
U为LED工作电压,LED一般最大电流为20ma。
在此R=(3.3-0.7)/0.02=130Ω。
因此本次示例中限流电阻阻值大于130Ω,才不会烧坏LED。
再看代码。
GPIO初始化。
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE, GPIO_Pin_5);
}
LED应用
void HW_Led0_Off(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_5); //设置GPIO输出1
}
void HW_Led0_on(void)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_5); //设置GPIO输出0
}
void HW_Led1_Off(void)
{
GPIO_SetBits(GPIOE, GPIO_Pin_5); //设置GPIO输出1
}
void HW_Led1_on(void)
{
GPIO_ResetBits(GPIOE, GPIO_Pin_5); //设置GPIO输出0
}
思考:为什么IO输出低电平时LED亮,而不是输出高电平?
思路:
1、由于单片机的I/O口的结构决定了它灌电流能力较强,而拉电流能力比较弱(即IO口的低平驱动能力较强而高电平驱动能力较差);
2、为了简化单片机接口的设计。高电平驱动和低电平驱动是同样的效果,另外,低电平驱动也简化了控制代码,避免了单片机上电复位时端口置高电平后对led的影响;
从STM32中文参考手册内得知,STM32的GPIO可配置为八种模式。
1、浮空输入(Input floating)
2、上拉输入(Input pull-up)
3、下拉输入(Input pull-down)
4、模拟输入(Analog)
5、开漏输出(Output open-drain)
6、推挽式输出(Output push-pull)
7、推挽式复用功能(Alternate function push-pull)
8、开漏复用功能(Alternate function open-drain)
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;
驱动LED使用的是推挽输出。推挽电路(push-pull)就是两个不同极性晶体管间连接的输出电路。
简单理解推挽和开漏的区别:驱动能力不同。推挽驱动能力强。
复用意思是GPIO不作为普通IO,而是特殊功能使用,比如ADC、USART等。
更深层次的研究可参考链接博客:https://blog.csdn.net/techexchangeischeap/article/details/72569999
引脚输出速度有3种:
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
GPIO的速度应该与应用匹配。速度配置越高,噪声越大,功耗越大。
比如配置为串口应用,波特率为115200,此时GPIO的速度配置为2MHz就够了,既省电也噪声小。
I2C接口,400K波特率,若想把余量留大些,可以配置为10MHz。
SPI接口,18M或9M需要选用50MHz的GPIO速度。
输入模式的讲解在下一篇笔记。
特殊应用重映射I/O在后续如有项目需要再添加入笔记。