1、GPIO的基本结构
2、GPIO的寄存器
每个GPIO端口有:
两个配置寄存器(GPIOx_CRL,GPIOx_CRH)
两个数据寄存器(GPIOx_IDR和GPIOx_ODR)
一个置位/复位寄存器(GPIOx_BSRR),
一个复位寄存器(GPIOx_BRR)
一个锁定寄存器(GPIOx_LCKR)
3、GPIO的模式
- 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 复用推挽输出
4、GPIO输出模式的速率
- GPIO_Speed_10MHz ,最高输出速率为10MHZ
- GPIO_Speed_2MHz, 最高输出速率为2MHZ
- GPIO_Speed_50MHz,最高输出速率为50MHZ
5、GPIO库函数
6、开始实践—点亮流水灯
led.c文件(我这里使用的是PC13、PC14、PC15这三个IO口,可根据自己的实际修改)
#include "led.h"
//初始化PC13、PC14、PC15为输出口.并使能这3个口的时钟
//LED IO初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //LED0-->PC13、14、15 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOC13
GPIO_SetBits(GPIOC,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PC13、14、15 输出高
}
led.h文件(我这里使用的是PC13、PC14、PC15这三个IO口,可根据自己的实际修改)
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define LED0 PCout(13)// PC13
#define LED1 PCout(14)// PC14
#define LED2 PCout(15)// PC15
void LED_Init(void);//初始化
#endif
key.c文件(我这里使用的是PB12、13、14、15这4个IO口,可根据自己的实际修改)
#include "stm32f10x.h"
#include "key.h"
//初始化
void KEY_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12;//KEY1-KEY4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB15,14,13,12
}
key.h文件(我这里使用的是PB12、13、14、15这4个IO口,可根据自己的实际修改)
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)//读取按键1
#define KEY2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)//读取按键2
#define KEY3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)//读取按键3
#define KEY4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)//读取按键4
void KEY_Init(void);//IO初始化
#endif
1、实现LED1、LED2、LED3正向流水灯功能(即依次顺序点亮,从上到下),LED间隔时间0.2S
#include "sys.h"
#include "delay.h"
#include "led.h"
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
LED0=0;LED1=1;LED2=1;delay_ms(200);
LED0=1;LED1=0;LED2=1;delay_ms(200);
LED0=1;LED1=1;LED2=0;delay_ms(200);
}
}
2、分别用按键1、2、3分别控制LED0、LED1、LED2的开关
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
int main(void)
{
vu8 key=0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init();
while(1)
{
if(KEY1 == 0)//LED0
{
delay_ms(10);
if(KEY1 ==0)
{
while(!KEY1);
LED0=!LED0;
}
}
if(KEY2 == 0)//LED1
{
delay_ms(10);
if(KEY2 ==0)
{
while(!KEY2);
LED1=!LED1;
}
}
if(KEY3 == 0)//LED2
{
delay_ms(10);
if(KEY3 ==0)
{
while(!KEY2);
LED2=!LED2;
}
}
}
}
3、若键盘未按下,LED1、LED2、LED3交替闪烁,每个LED闪烁间隔时间0.2S(一亮一灭共0.2S),持续1S。
若键盘K2按下,实现LED1、LED2、LED3正向流水灯功能(即依次顺序点亮,从上到下),LED间隔时间0.2S。
若键盘K3按下,实现LED1、LED2、LED3反向流水灯功能(即依次顺序点亮,从下到上),LED间隔时间0.2S。
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
int main(void)
{
int i;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
LED0=0;LED1=1;LED2=1;delay_ms(200);
LED0=1;LED1=0;LED2=1;delay_ms(200);
LED0=1;LED1=1;LED2=0;delay_ms(200);
while(1)
{
if(KEY1 == 0)
{
delay_ms(10);
for(i=0;i<5;i++)//从上到下流水5次
{
LED0=0;LED1=1;LED2=1;delay_ms(200);
LED0=1;LED1=0;LED2=1;delay_ms(200);
LED0=1;LED1=1;LED2=0;delay_ms(200);
}
}
if(KEY2 == 0)
{
delay_ms(10);
for(i=0;i<5;i++)//从下到上流水5次
{
LED0=1;LED1=1;LED2=0;delay_ms(200);
LED0=1;LED1=0;LED2=1;delay_ms(200);
LED0=0;LED1=1;LED2=1;delay_ms(200);
}
}
}
}
今天的学习就到这里啦,加油加油,我们下次见!!!