20230420初级点灯和hel封装点灯实验

初级点灯

#ifndef __LED_H__
#define __LED_H__

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)

void led1_init();
void led1_on();
void led1_off();

void led2_init();
void led2_on();
void led2_off();

void led3_init();
void led3_on();
void led3_off();

#endif
#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++);
}

int main()
{
	led1_init(); // LED灯初始化
	led2_init(); // LED灯初始化
	led3_init(); // LED灯初始化

	while(1)
	{
		led1_on();
		led2_on();
		led3_on();
		delay_ms(500);
		led1_off();
		led2_off();
		led3_off();
		delay_ms(500);
	}
	return 0;
}

#include"led.h"
//pe10
void led1_init()
{
	//RCC使能
	(*(volatile unsigned int *)0x50000A28) |=(0x1<<4);
	//设置输出模式
	GPIOE->MODER &=(~(0x3<<20));
	
	GPIOE->MODER |=(0x1<<20);

	GPIOE->OTYPER&=(~(0x1<<10));

	GPIOE->OSPEEDR&=(~(0x3<<20));

	GPIOE->PUPDR&=(~(0x3<<20));
}
void led1_on()
{
	GPIOE->ODR |= (0x1<<10);

}
void led1_off()
{
	GPIOE->ODR&=(~(0x1<<10));
}

//pf10
void led2_init()
{
	//RCC使能
	(*(volatile unsigned int *)0x50000A28) |=(0x1<<5);
	
	GPIOF->MODER &=(~(0x3<<20));
	GPIOF->MODER |=(0x1<<20);

	GPIOF->OTYPER&=(~(0x1<<10));

	GPIOF->OSPEEDR&=(~(0x3<<20));

	GPIOF->PUPDR&=(~(0x3<<20));
}
void led2_on()
{
	GPIOF->ODR |= (0x1<<10);

}
void led2_off()
{
	GPIOF->ODR&=(~(0x1<<10));

}

//pe8
void led3_init()
{
	//RCC使能
	(*(volatile unsigned int *)0x50000A28) |=(0x1<<4);
	
	GPIOE->MODER &=(~(0x3<<16));
	GPIOE->MODER |=(0x1<<16);

	GPIOE->OTYPER&=(~(0x1<<8));

	GPIOE->OSPEEDR&=(~(0x3<<16));

	GPIOE->PUPDR&=(~(0x3<<16));
}
void led3_on()
{
	GPIOE->ODR |= (0x1<<8);
}
void led3_off()
{
	GPIOE->ODR&=(~(0x1<<8));

}


hel封装点灯

#ifndef __LED_H__
#define __LED_H__

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)

//封装输出模式
typedef enum{
	INPUT,
	OUTPUT,
	ALT,
	ANALOG	
}gpio_moder_t;
//封装输出类型
typedef enum{
	PUSH_PULL,
	OPEN_DRAIN
} gpio_type_t;
//封装输出速率寄存器
typedef enum{
	LOW_SPEED,
	MEDIUM_SPEED,
	HIGH_SPEED,
	VERY_HIGH_SPEED
}gpio_speed_t;
//封装是否上下拉
typedef enum{
	NO_pull_up_pull_down,
	PULL_UP,
	PULL_DOWN,
	RESERVED
}gpio_pupdr_t;
//封装输出高低电平
typedef enum{
	GPIO_RESET_T,
	GPIO_SET_T
}gpio_status_t;

//结构体寄存器初始化
typedef struct{
	gpio_moder_t moder;
	gpio_type_t type;
	gpio_speed_t speed;
	gpio_pupdr_t pupdr;
}gpio_init_t;
//引脚封装
#define GPIO_PIN_8 8
#define GPIO_PIN_10 10


//初始化函数
void hal_gpio_init(gpio_t* gpiox,unsigned int pin,gpio_init_t* init);
//操作GPIO接口写函数
void hal_gpio_write(gpio_t*gpiox,unsigned int pin,gpio_status_t status);
#endif
#include"led.h"
//初始化函数
void hal_gpio_init(gpio_t* gpiox,unsigned int pin,gpio_init_t* init)
{

	(*(volatile unsigned int *)0x50000A28) |=(0x1<<pin/2);
	//设置输出模式
	gpiox->MODER &=(~(0x3<<(pin*2)));
	gpiox->MODER |=(init->moder<<(pin*2));
	//设置类型
	gpiox->OTYPER&=(~(0x1<<pin));
	gpiox->OTYPER|=(init->type<<pin);
	//设置数率
	gpiox->OSPEEDR&=(~(0x3<<pin*2));
	gpiox->OSPEEDR |=(init->speed<<pin*2);
	//设置上下拉
	gpiox->PUPDR&=(0x3<<pin*2);
	gpiox->PUPDR|=(init->pupdr<<pin*2);
}

//操作GPIO接口写函数

void hal_gpio_write(gpio_t*gpiox,unsigned int pin,gpio_status_t status)
{
	if(status==1){
		gpiox->ODR |= (0x1<<pin);
	}
	else if(status==0){
	gpiox->ODR &= (~(0x1<<pin));
	}
}

#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++);
}


int main()
{
	//初始化函数
	gpio_init_t gpio_init;
	gpio_init.moder=OUTPUT;
	gpio_init.type=PUSH_PULL;
	gpio_init.speed=LOW_SPEED;
	gpio_init.pupdr=NO_pull_up_pull_down;

	hal_gpio_init(GPIOE,GPIO_PIN_10,&gpio_init);

	hal_gpio_init(GPIOF,GPIO_PIN_10,&gpio_init);
	hal_gpio_init(GPIOE,GPIO_PIN_8,&gpio_init);


	
	while(1)
	{

		hal_gpio_write(GPIOE,GPIO_PIN_10,GPIO_SET_T);
		hal_gpio_write(GPIOF,GPIO_PIN_10,GPIO_SET_T);
		hal_gpio_write(GPIOE,GPIO_PIN_8,GPIO_SET_T);

		delay_ms(500);

		hal_gpio_write(GPIOE,GPIO_PIN_10,GPIO_RESET_T);
		hal_gpio_write(GPIOF,GPIO_PIN_10,GPIO_RESET_T);
		hal_gpio_write(GPIOE,GPIO_PIN_8,GPIO_RESET_T);

		delay_ms(500);
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值