arm_点灯_封装函数实现

include/led.h

#ifndef __LED_H__
#define __LED_H__

#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)
#define RCC_MP_AHB4ENSETR (*(volatile int*)0x50000A28)

//引脚封装
#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
#define GPIO_PIN_6 6
#define GPIO_PIN_7 7 
#define GPIO_PIN_8 8
#define GPIO_PIN_9 9 
#define GPIO_PIN_10 10
#define GPIO_PIN_11 11
#define GPIO_PIN_12 12
#define GPIO_PIN_13 13
#define GPIO_PIN_14 14
#define GPIO_PIN_15 15
//寄存器封装
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;

//模式寄存器封装
typedef enum{
	INPUT,  //输入
	OUTPUT, //输出
	ALT,    //复位
	ANALOG, //模拟
}gpio_moder_t;
//输出类型寄存器封装
typedef enum{
	PP,//推挽
	OD, //开漏
}gpio_otyper_t;
//输出速度寄存器封装
typedef enum{
	LOW, //低速
	MED, //中速
	HIGH, //高速
	VERY_HIGH, //超高速
}gpio_ospeeder_t;
//是否需要上下拉电阻寄存器封装
typedef enum{
	NO_PUPDR, //禁止
	PU, //上拉
	PD, //下拉
}gpio_pupdr_t;
//输出高低电平寄存器封装
typedef enum{
	GPIO_RESET_T, //输出低电平
	GPIO_SET_T, //输出高电平
}gpio_odr_t;
//寄存器初始化封装
typedef struct{
	gpio_moder_t moder; //模式寄存器
	gpio_otyper_t opter; //输出类型寄存器
	gpio_ospeeder_t ospeeder;//输出速度
	gpio_pupdr_t pupdr; //是否需要上下拉电阻寄存器
}gpio_init_t;

//封装函数1功能:GPIO初始化相关操作 
//参数:GPIO组号  引脚编号  初始化相关值
//返回值:无
void my_Initi_Led(gpio_t* gpiox,unsigned int pin,gpio_init_t* init);

//封装函数2功能:GPIO引脚操作 
//参数:GPIO组号  引脚编号  写入的值
//返回值:无
void my_Gpio_Led(gpio_t* gpiox,unsigned int pin,unsigned int gpio_status);

#endif

src/led.c

#include "led.h"

void my_Initi_Led(gpio_t* gpiox,unsigned int pin,gpio_init_t* init)
{
	//模式
	gpiox->MODER &= (~(0x3 << (2*pin)));
	gpiox->MODER |= (init->moder << (2*pin));
	//类型
	gpiox->OTYPER &= (~(0x1 << pin));
	gpiox->OTYPER |= (init->opter << pin);
	//速度
	gpiox->OSPEEDR &= (~(0x3 << (2*pin)));
	gpiox->OSPEEDR |= (init->ospeeder << (2*pin));
	//上下拉电阻
	gpiox->PUPDR &= (~(0x3 << (2*pin)));
	gpiox->PUPDR |= (init->pupdr << (2*pin));
}

void my_Gpio_Led(gpio_t* gpiox,unsigned int pin,unsigned int gpio_status)
{
	if(gpio_status == GPIO_RESET_T)
	{
		gpiox->ODR &=  (~(0x1 << pin));
	}
	else
	{
		gpiox->ODR |= (0x1 << pin);
	}
}

main.c

#include "led.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}
void init__Led()
{
	//通过RCC章节 将GPIOE GPIOF 组控制器使能
	RCC_MP_AHB4ENSETR |= (0x3 << 4);
	//结构体初始化
	gpio_init_t init = {OUTPUT,PP,LOW,NO_PUPDR};
	//调用函数初始化
	my_Initi_Led(GPIOE,GPIO_PIN_10, &init);
	my_Initi_Led(GPIOF,GPIO_PIN_10, &init);
	my_Initi_Led(GPIOE,GPIO_PIN_8, &init);
}
int main()
{	
	init__Led();
	while(1)
	{
		my_Gpio_Led(GPIOE,GPIO_PIN_10,GPIO_SET_T);
		delay_ms(1000);
		my_Gpio_Led(GPIOE,GPIO_PIN_10,GPIO_RESET_T);
		delay_ms(1000);

        my_Gpio_Led(GPIOF,GPIO_PIN_10,GPIO_SET_T);
		delay_ms(1000);
	    my_Gpio_Led(GPIOF,GPIO_PIN_10,GPIO_RESET_T);
		delay_ms(1000);

		my_Gpio_Led(GPIOE,GPIO_PIN_8,GPIO_SET_T);
		delay_ms(1000);
		my_Gpio_Led(GPIOE,GPIO_PIN_8,GPIO_SET_T);
		delay_ms(1000);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lsw2604190117/article/details/131533777
今日推荐