一 什么是
GPIO:
GPIO(general porpose intput output),
通用输入输出端口
.
二 我们先认识芯片控制
GPIO
输出控制。
2.1LED
硬件原理如图:
当电流从这根电线流通,
LED
亮。当电流不通过这根电线,
LED
灭。
上面
PF**
,芯片电压为低,
LED
亮。为高时,不亮。
上面
PE**
,芯片电压为高,
LED
亮。为低时,不亮。
(可以见得,我们的嵌入式工程师编码与硬件工程师密切相关)
还可以结论:电流的高低输出,程序决定的。芯片侧
程序决定
给这根电线供电、
或者断电。芯片外侧接
LED
灯,我们肉眼观察
led
的亮灭。判断我们控制手段是
否达成。
2.2.3.1
;流程图第一步时钟使能函数:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph,NewState);
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph, NewState);
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph,NewState);
RCC_APB1PeriphClockCmd( RCC_APB1Periph, NewState);
RCC_APB2PeriphClockCmd(RCC_APB2Periph, NewState);
选择:
RCC_AHB1PeriphClockCmd
(
RCC_AHB1Periph_GPIOF
,
ENABLE
)
;
函数解释:让第
F
组成员都有时钟控制。没有这个时钟信号,都无法工作。
参数
1:RCC_AHB1Periph_GPIOF,
选择第几组。
参数
2
:
DISABLE/ENABLE
2.2.3.2
流程图第二部
GPIO
基本配置:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
函数解释:让程序决定第几组第几根引脚,如何工作。
参数
1
:
GPIOx
:第几组,
GPIOA/GPIOB/GPIOC/GPIOD/GPIOE/GPIOF/GPIOG/GPIOH/GPIOI/GPIOJ/GPI
OK
说明:查看确认引脚号,例如
PF9,
对应组为:
GPIOF
。
参数
2
:第几根,如何干活。
GPIO_InitTypeDef
结构体名字;
结构体名字
.GPIO_Pin =
引脚号
; GPIO_Pin_0/....GPIO_Pin_15/GPIO_Pin_ALL
结构体名字
.GPIO_Mode =
输入输出类型
; GPIO_Mode_IN/GPIO_Mode_OUT/
(
结构体名字
.GPIO_Speed =
速度
; GPIO_Low_Speed/...GPIO_High_Speed
结构体名字
.GPIO_OType =
类型
; GPIO_OType_PP/GPIO_OType_OD
结构体名字
.GPIO_PuPd =
上下拉电阻
; GPIO_PuPd_UP /GPIO_PuPd_DOWN
)
2.2.3.3
流程图第三步
GPIO
基本操控:
GPIO_SetBits(GPIOF, GPIO_Pin_9); PF9
输出高电平,根据硬件原理图,
LED
灭
GPIO_ResetBits(GPIOF, GPIO_Pin_9);PF9
输出低电平,根据硬件原理图,
LED
亮
整体编码整体如下:
// 时钟使能RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//GPIO 基本参数配置GPIO_InitTypeDef led_gpio_initstruct;led_gpio_initstruct.GPIO_Mode = GPIO_Mode_OUT;led_gpio_initstruct.GPIO_OType = GPIO_OType_PP;led_gpio_initstruct.GPIO_Pin = GPIO_Pin_9;led_gpio_initstruct.GPIO_Speed = GPIO_High_Speed;GPIO_Init(GPIOF,&led_gpio_initstruct);while(1){//gpio 的基本操控GPIO_SetBits(GPIOF, GPIO_Pin_9);GPIO_ResetBits(GPIOF, GPIO_Pin_9);// Bit_RESET Bit_SET//GPIO_WriteBit(GPIOF,GPIO_Pin_9,1);//GPIO_Write(GPIOF,0X0200);}
第三:请对于GPIO的基本操控进行改写。要求LED灯会一闪一闪的。
流程:
1
打开
LED
,
2
延时,
3
关闭
LED
,
4
延时。重复执行四个步骤
延时函数实现:
delay() { uint32_t t = 50000;while(t--)}
while(1){GPIO_SetBits(GPIOF,GPIO_Pin_10);delay(time);GPIO_ResetBits(GPIOF, GPIO_Pin_10);delay(5000-time);time++;if(time == 5000) break;}while(1){GPIO_SetBits(GPIOF,GPIO_Pin_10);delay(time);GPIO_ResetBits(GPIOF, GPIO_Pin_10);delay(5000-time);time--;if(time == 0) break;}
3.1GPIO
的结构图,从电器特性来看代码:
1.
保护二极管:保护电压数值,不超过
VDD.
流程:
1
打开
LED
,
2
延时,
3
关闭
LED
,
4
延时。重复执行四个步骤
延时函数实现:
delay() { uint32_t t = 50000;while(t--)}
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay(time);
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
delay(5000-time);
time++;
if(time == 5000) break;
}
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay(time);
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
delay(5000-time);
time--;
if(time == 0) break;
}
2.
可调节电阻,上方接通,为高电平。下方接通为低电平。
3.
施密特触发器。三角形的宽的一端有电压数值,尖端会输出
1
。反之为
0
。
4.
两个三极管,上方导通,输出的是高信号对应高电平。下方导通,输出的低电
平对应的
0
信号。
GPIO_InitTypeDef led_gpio_initstruct; led_gpio_initstruct.GPIO_Mode =
GPIO_Mode_OUT;
决定是输入
,
输出
,
复用
,
模拟
led_gpio_initstruct.GPIO_OType
= GPIO_OType_PP;
决定是推挽还是开漏
led_gpio_initstruct.GPIO_Pin =
GPIO_Pin_9;
决定哪一个引脚
led_gpio_initstruct.GPIO_Speed =
GPIO_High_Speed;
决定最大输出速度
GPIO_Init(GPIOF,&led_gpio_initstruct);
3.2GPIO
输出模式:
推挽输出
:推出去为推。拉回来为挽。推挽输出可以输出高电平与低电平。
当高电平输出的时候,
LED
灭。当低电平输出的时候
LED
亮。局限在于推挽输出
引脚与输入引脚连接后,容易烧坏板子。因此引入开漏输出。不能与数据输入同
时存在。
开漏输出
:开路输出
,
仅仅输出低电平和高阻态,开漏输出会有外部电流供电,
LED
默认为
LED
亮。当输出低电平会产生短路,实现了对于
LED
灭。耗电时间长
的,耗电量大的首选这个。而且,采集信号输出信号可以同时存在。
3.3GPIO
输出开发任务:
任务选择:
开漏输出用例:
推挽输出用例:
LED
灯的代码封装
:
初始化封装,
led.c led.h
输出总结:
输出模式:
共计四种输出模式。
开漏输出
,
推挽输出
,
开漏复用
*
*
,
推挽复用
。
两种输出模式仅仅是数据来源来自 复用功能输出而不是输出寄存器。完全可以
参考(
开漏输出和推挽输出
)