day4 arm

c语言 封装 枚举 点灯

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++);
}
 
 
int main()
{
	gpio_init_t led1 = {OUTPUT,PUSH_PULL,LOW,NO_PULL};
	gpio_init_t led2 = {OUTPUT,PUSH_PULL,LOW,NO_PULL};
	gpio_init_t led3 = {OUTPUT,PUSH_PULL,LOW,NO_PULL};
 
	hal_gpio_init(GPIOE,&led1,GPIO_PIN_10);
    hal_gpio_init(GPIOF,&led2,GPIO_PIN_10);
	hal_gpio_init(GPIOE,&led3,GPIO_PIN_8);
 
	while(1)
	{
	    hal_gpio_write(GPIOE,GPIO_SET_T,GPIO_PIN_10);
        delay_ms(1000);
		hal_gpio_write(GPIOE,GPIO_RESET_T,GPIO_PIN_10);
 
        hal_gpio_write(GPIOF,GPIO_SET_T,GPIO_PIN_10);
        delay_ms(1000);
		hal_gpio_write(GPIOF,GPIO_RESET_T,GPIO_PIN_10);
		
		hal_gpio_write(GPIOE,GPIO_SET_T,GPIO_PIN_8);
        delay_ms(1000);
		hal_gpio_write(GPIOE,GPIO_RESET_T,GPIO_PIN_8);
	}
	return 0;
}

led.h

#ifndef __LED_H__
#define __LED_H__
 
//结构体封装
#define RCC_AHB4_ENSETR (*(volatile unsigned int *)0x50000A28)
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_otyper_t;
 
//封装速率类型寄存器
typedef enum{
    LOW,
	MEDIUM,
	HIGH,
	VHIGH
}gpio_ospeedr_t;
 
//封装是否上下拉电阻寄存器
typedef enum{
    NO_PULL,
	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_otyper_t otyper;//封装输出类型寄存器
	gpio_ospeedr_t ospeedr;//封装速率类型寄存器
	gpio_pupdr_t pupdr;//封装是否上下拉电阻寄存器	
}gpio_init_t;
 
//引脚封装
#define GPIO_PIN_0 0
#define GPIO_PIN_8 8 
#define GPIO_PIN_10 10
 
//初始化函数
void hal_gpio_init(gpio_t* gpiox,gpio_init_t* init,unsigned int pin);
 
//操作GPIO接口写函数
void hal_gpio_write(gpio_t* gpiox,gpio_status_t status,unsigned int pin);
 
#endif

led.c

#include "led.h"
void hal_gpio_init(gpio_t* gpiox,gpio_init_t* init,unsigned int pin)
{
    if(gpiox==GPIOE)
		RCC_AHB4_ENSETR|=(0x1<<4);
	else if(gpiox==GPIOF)
		RCC_AHB4_ENSETR|=(0x1<<5);
	
	gpiox->MODER&=(~(0X3)<<(2*pin));
	gpiox->MODER|=(init->moder<<(2*pin));
 
	gpiox->OTYPER&=(~(0x1)<<pin);
	gpiox->OTYPER|=(init->otyper<<pin);
 
	gpiox->OSPEEDR&=(~(0x3<<(2*pin)));
	gpiox->OSPEEDR|=(init->ospeedr<<(2*pin));
 
    gpiox->PUPDR&=(~(0x3<<(2*pin)));
	gpiox->PUPDR|=(init->pupdr<<(2*pin));
    
	return ;
}
 
void hal_gpio_write(gpio_t* gpiox,gpio_status_t status,unsigned int pin)
{
    gpiox->ODR&=(~(0x1)<<pin);
	gpiox->ODR|=(status<<pin);
	return;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值