现在已经学习了 GPIO 的输出和输入,控制 GPIO 的输出和输入是非常常用的操作,可以在此基础上进行提炼,做一个针对 GPIO 的驱动。
拷贝上一节:【ARM 裸机】按键输入 的工程代码,做相关准备工作;
新建一个 gpio 目录,编写 gpio 的驱动文件如下;
#include "bsp_gpio.h"
// GPIO 初始化
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config)
{
if(config->direction == kGPIO_DigtalInput)
{
base->GDIR &= ~(1 << pin);
}
else
{
base->GDIR |= (1 << pin);
// 默认输出电平
gpio_pinwrite(base, pin, config->outputlogic);
}
}
// 输出高低电平
void gpio_pinwrite(GPIO_Type *base, int pin, int value)
{
if(value == 0)
{
base->DR &= ~(1 << pin);
}
else
{
base->DR |= (1 << pin);
}
}
// 读取 GIIO 电平
int gpio_pinread(GPIO_Type *base, int pin)
{
return(((base->DR) >> pin) & 0x1);
}
#ifndef __BSP_GPIO_H
#define __BSP_GPIO_H
#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "MCIMX6Y2.h"
#include "cc.h"
// 枚举类型和 GPIO 结构体
typedef enum _gpio_pin_direction
{
kGPIO_DigtalInput = 0U,
kGPIO_DigtalOutput = 1U,
}gpio_pin_direction_t;
typedef struct _gpio_pin_config
{
gpio_pin_direction_t direction;
uint8_t outputlogic;
}gpio_pin_config_t;
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config);
void gpio_pinwrite(GPIO_Type *base, int pin, int value);
int gpio_pinread(GPIO_Type *base, int pin);
#endif
添加头文件包含路径;
修改 key 的函数;
修改 beep 的函数;
将对 ON 和 OFF 的定义移到 cc.h 中;
修改 Makefile 文件;
编译烧写;
烧写之后可以正常运行,以后对 gpio 的操作就变得方便了。