cortex-A7核 led灯封装库点亮实验

gpio.h:

#ifndef __LED_H__
#define __LED_H__
//防止头文件重复包含

//LED1-->PE10
//LED2-->PF10
//LED3-->PE8


//RCC_MP_AHB4ENSETR寄存器封装
#define RCC_MP_AHB4ENSETR (*(volatile unsigned int*)0x50000A28)

//GPIO使用结构体封装
typedef struct{
	volatile unsigned int MODER;
	volatile unsigned int OTYPER;
	volatile unsigned int OSPEEDR;
	volatile unsigned int PUPDR;
	volatile unsigned int IDR;
	volatile unsigned int ODR;
}gpio_t;

#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)


//LED1-->PE10
//封装初始化函数
void LED1_RCC_GPIO_INIT();


//LED1点亮函数
void LED1_ON();
//LED1熄灭函数
void LED1_OFF();


#define GPIO_PIN_0 0
#define GPIO_PIN_1 1
#define GPIO_PIN_2 2
#define GPIO_PIN_3 3
#define GPIO_PIN_4 4
#define GPIO_PIN_5 5

//使用枚举封装MODER模式寄存器
typedef enum{
	INPUT, //输入 0
	OUTPUT, //输出 1
	ALT, //复用 2
	ANALOG //模拟 3
}gpio_moder_t;

//使用枚举封装OTYPER寄存器
typedef enum{
	PP, //推挽
	OD //开漏
}gpio_otyper_t;

//使用枚举封装OSPEEDR寄存器
typedef enum{
	LOW, //低速 0
	MED, //中速 1
	HIGH, //高速 2
	VERY_HIGH //快速 3
}gpio_ospeedr_t;

//使用枚举封装PUPDR寄存器
typedef enum{
	NO_PUPDR, //禁止上下拉电阻 0
	PU, //上拉 1
	PD //下拉 2
}gpio_pupdr_t;

//封装初始化结构体
typedef struct{
	gpio_moder_t moder;//模式寄存器
	gpio_otyper_t otyper;//输出类型寄存器
	gpio_ospeedr_t ospeedr;//输出速率寄存器
	gpio_pupdr_t pupdr;//是否需要上下拉电阻寄存器
	
}gpio_init_t;

//使用枚举封装ODR寄存器
typedef enum{
	GPIO_RESET_T, //熄灭0
	GPIO_SET_T //灯点亮1
	
}gpio_status_t;


void ha1_gpio_init(gpio_t* gpiox, unsigned int pin, gpio_init_t* init);
//函数功能:GPIO引脚初始化操作


void ha1_gpio_write(gpio_t* gpiox, unsigned int pin, gpio_status_t status)
//函数功能:GPIO引脚操作 写1灯亮 写0 灯灭


#endif

gpio.c: 

#include "gpio.h"
//函数功能:GPIO引脚初始化操作
//参数1:GPIO组号
//参数2:引脚编号
//参数3:初始化内容
void hal_gpio_init(gpio_t *gpiox,unsigned int pin,gpio_init_t *init){
	//1、设置GPIO引脚的模式
	gpiox->MODER &= (~(0x3 << (pin*2))); 
	gpiox->MODER |= (init->moder << (pin*2));
	//2、设置GPIO引脚输出模式
	gpiox->OTYPER &= (~(0x1 << pin));
	gpiox->OTYPER |= (init->otyper << pin);
	//3、设置GPIO引脚输出速率
	gpiox->OSPEEDR &= (~(0x1 << pin));
	gpiox->OSPEEDR |= (init->ospeedr << (pin*2));
	//4、设置引脚是否需要上下拉电阻
	gpiox->PUPDR &= (~(0x3 << (pin*2)));
	gpiox->PUPDR |= (init->pupdr << (pin*2));
}


//函数功能:GPIO引脚操作写1灯点亮,写0灯熄灭
//参数1:GPIO组号
//参数3:引脚编号
//参数3:写的内容
void hal_gpio_write(gpio_t *gpiox,unsigned int pin,gpio_status_t status){
	if(status == GPIO_RESET_T){ //熄灭
		gpiox->ODR &= (~(0x1 << pin));
	}else{  //点亮
		gpiox->ODR |= (0x1 << pin);
	}
}

你可能感兴趣的:(单片机,嵌入式硬件)