LED灯实验

6 篇文章 0 订阅
5 篇文章 0 订阅

1分析LED灯的电路图

1> 再扩展板的PCB板上找到LED灯对应的位置,查看LED灯对应的丝印编号。查找LED1灯对应的丝印为”LD1”.

2> 打开扩展版的原理图,再原理图上搜索“LD1”丝印,找到LD1对应的原理图,如下所示:

再扩展板的原理图上搜索”LED1“网络标号,如下图所示:

3> 打开转接板的原理图,再转接板的原理图上搜索”LED1“网络标号,如下图所示:

再转接板的原理图上搜索”PE10“网络标号,得到以下图:

4> 打开主板的原理图,搜索”PE10“网络标号,如下图所示:

5> 通过电路图的分析可知,LED1灯接到SOC的PE10引脚之上,编写程序让PE10引脚输出高低电平即可。

	PE10的含义:
	
	P : Pin, gpio引脚(通用的输入输出引脚)
	E : 引脚的所属的组,E组, 每组最多有16个引脚,引脚的编号为0-15.
	10 : PE组的第10个引脚

6> 分析LED2, LED3,蜂鸣器,风扇,马达,KEY1, KEY2,KEY3,分别接到SOC的哪个引脚之上。

LED1       ----> PE10
LED2       ----> PF10
LED3       ----> PE8
蜂鸣器      ----> PB6
风扇       ----> PE9
马达       ----> PF6
KEY1       ----> PF9
KEY2       ----> PF7
KEY3       ----> PF8

2分析电路图-->电路的工作原理

通过对led1灯的电路图分析可知,
当PE10引脚输出高电平时,NPN三极管导通,LED1灯亮;
当PE10引脚输出低电平时,NPN三极管截止,LED1灯灭。

3分析芯片手册-->如何编程驱动硬件

4 分析GPIO章节

5 分析GPIOx_MODER寄存器

#ifndef __GPIO_H__
#define __GPIO_H__
#include "stm32mp1xx_gpio.h"

// 1. 封装RCC_MP_AHB4ENSETR寄存器,封装GPIOE,GPIOF寄存器
#define RCC_MP_AHB4ENSETR (*(volatile unsigned int *)0x50000A28)

// 2. 封装LED灯控制的函数
#define GPIO_PIN_0 0U
#define GPIO_PIN_1 1U
#define GPIO_PIN_2 2U
#define GPIO_PIN_3 3U
#define GPIO_PIN_4 4U
#define GPIO_PIN_5 5U
#define GPIO_PIN_6 6U
#define GPIO_PIN_7 7U
#define GPIO_PIN_8 8U
#define GPIO_PIN_9 9U
#define GPIO_PIN_10 10U
#define GPIO_PIN_11 11U
#define GPIO_PIN_12 12U
#define GPIO_PIN_13 13U
#define GPIO_PIN_14 14U
#define GPIO_PIN_15 15U
typedef enum
{
    GPIO_INPUT = 0,
    GPIO_OUTPUT,
    GPIO_AF,
    GPIO_ANALOG,
} gpio_mode_t; // gpio引脚模式的枚举类型

typedef enum
{
    GPIO_PP = 0,
    GPIO_OD,
} gpio_type_t; // gpio引脚的类型

typedef enum
{
    GPIO_LOW_SPEED = 0,
    GPIO_MEDIUM_SPEED,
    GPIO_HIGH_SPEED,
    GPIO_VERY_HIGH_SPEED,
} gpio_speed_t; // gpio引脚的速度

typedef enum
{
    GPIO_NO_PUPD = 0,
    GPIO_UP,
    GPIO_DOWN,
} gpio_pupd_t;

typedef enum
{
    GPIO_RESET = 0,
    GPIO_SET,
} gpio_statues_t;

typedef struct
{
    unsigned int pins;  // 哪个引脚
    gpio_mode_t mode;   // 引脚的模式
    gpio_type_t type;   // 引脚的类型
    gpio_speed_t speed; // 引脚的速度
    gpio_pupd_t pupd;   // 引脚的上拉和下拉
} gpio_init_t;          // gpio引脚初始化的结构体

/*
    功能:GPIO引脚的初始化
    参数:
        gpios : 哪个组的gpio引脚
        gpio_init : 引脚初始化的结构体
*/
void hal_gpio_init(gpio_t *gpios, gpio_init_t *gpio_init);
/*
    功能:写gpio引脚的状态函数
    参数:
        gpios : 哪个组的gpio引脚
        pins : 哪个引脚
        statues : 引脚的状态
*/
void hal_gpio_write(gpio_t *gpios, unsigned int pins, gpio_statues_t statues);

/*
    功能:读gpio引脚状态的函数
    参数:
        gpios : 哪个组的gpio引脚
        pins : 哪个引脚
    返回值:
        statues : 引脚的状态
*/
gpio_statues_t hal_gpio_read(gpio_t *gpios, unsigned int pins);

void hal_gpio_toggle(gpio_t *gpios, unsigned int pins);
#endif

led.h

#ifndef __LED_H__
#define __LED_H__

#include "gpio.h"

void hal_led_init(void);

void hal_led_on(void);

void hal_led_off(void);

#endif 

gpio.c

#include "../include/gpio.h"
/*
    功能:GPIO引脚的初始化
    参数:
        gpios : 哪个组的gpio引脚
        gpio_init : 引脚初始化的结构体
*/
void hal_gpio_init(gpio_t *gpios, gpio_init_t *gpio_init)
{
    gpios->MODER &= (~(0x3 << (gpio_init->pins * 2)));
    gpios->MODER |= (gpio_init->mode << (gpio_init->pins * 2));

    gpios->OTYPER &= (~(0x1 << gpio_init->pins));
    gpios->OTYPER |= (gpio_init->type << gpio_init->pins);

    gpios->OSPEEDR &= (~(0x3 << (gpio_init->pins * 2)));
    gpios->OSPEEDR |= (gpio_init->speed << (gpio_init->pins * 2));

    gpios->PUPDR &= (~(0x3 << (gpio_init->pins * 2)));
    gpios->PUPDR |= (gpio_init->pupd << (gpio_init->pins * 2));
}
/*
    功能:LED灯的开关状态的函数
    参数:
        gpios : 哪个组的gpio引脚
        pins : 哪个引脚
        statues : 引脚的状态
*/
void hal_gpio_write(gpio_t *gpios, unsigned int pins, gpio_statues_t statues)
{
    if (!statues)
    {
        gpios->ODR &= (~(0x1 << pins));
    }
    else
    {
        gpios->ODR |= (0x1 << pins);
    }
}

gpio_statues_t hal_gpio_read(gpio_t *gpios, unsigned int pins)
{
    gpio_statues_t statu;
    if (gpios->IDR & (0x1 << pins))
    {
        statu = GPIO_SET;
    }
    else
    {
        statu = GPIO_RESET;
    }
    return statu;
}

void hal_gpio_toggle(gpio_t *gpios, unsigned int pins)
{
    gpios->ODR ^= (0x1 << pins);
}

led.c

#include "../include/led.h"

void hal_led_init(void)
{
    RCC_MP_AHB4ENSETR |= (0x3 << 4);
    gpio_init_t init = {
        .pins = GPIO_PIN_10,
        .mode = GPIO_OUTPUT,
        .type = GPIO_PP,
        .speed = GPIO_LOW_SPEED,
        .pupd = GPIO_NO_PUPD,
    };
    hal_gpio_init(GPIOE, &init);

    hal_gpio_init(GPIOF, &init);

    init.pins = GPIO_PIN_8;
    hal_gpio_init(GPIOE, &init);
}

void hal_led_on(void)
{
    hal_gpio_write(GPIOE, GPIO_PIN_10, GPIO_SET);
    hal_gpio_write(GPIOF, GPIO_PIN_10, GPIO_SET);
    hal_gpio_write(GPIOE, GPIO_PIN_8, GPIO_SET);
}

void hal_led_off(void)
{
    hal_gpio_write(GPIOE, GPIO_PIN_10, GPIO_RESET);
    hal_gpio_write(GPIOF, GPIO_PIN_10, GPIO_RESET);
    hal_gpio_write(GPIOE, GPIO_PIN_8, GPIO_RESET);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值