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;
}