当前位置: 首页 > news >正文

LED灯实验

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

相关文章:

  • vue中ref的作用
  • JSP简介
  • 湖仓一体电商项目(八):业务实现之编写写入ODS层业务代码
  • 基于深度学习的多人步态识别系统(YOLOV5+DeepSort+GaitSet+Segmentation)
  • 计算机网络——组成、分类、性能指标、分层结构
  • 【小程序】组件化开发的基本使用(二)
  • 【IVI】15.1.6 系统稳定性优化篇(LMKD 六)Vmpressure监视器初始化及其工作原理
  • 分享程序员面试的7个技巧
  • 市政管理学考试复习资料
  • c语言数据结构 二叉树(三)
  • 汉明码原理
  • 黑马瑞吉外卖之菜品信息的修改
  • 【Vue 基础知识】v-for的使用和注意事项
  • LeetCode Cookbook 数组习题(8)
  • Java新手小白入门篇 SpringBoot项目的构建
  • [LeetCode] Wiggle Sort
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Angularjs之国际化
  • Fastjson的基本使用方法大全
  • Github访问慢解决办法
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • PaddlePaddle-GitHub的正确打开姿势
  • vue的全局变量和全局拦截请求器
  • windows下使用nginx调试简介
  • 从零搭建Koa2 Server
  • 仿天猫超市收藏抛物线动画工具库
  • 基于Android乐音识别(2)
  • 经典排序算法及其 Java 实现
  • 前端之Sass/Scss实战笔记
  • 区块链将重新定义世界
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用API自动生成工具优化前端工作流
  • 世界上最简单的无等待算法(getAndIncrement)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 用mpvue开发微信小程序
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # C++之functional库用法整理
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #Linux(Source Insight安装及工程建立)
  • #每天一道面试题# 什么是MySQL的回表查询
  • $NOIp2018$劝退记
  • (3)(3.5) 遥测无线电区域条例
  • (4)Elastix图像配准:3D图像
  • (a /b)*c的值
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (南京观海微电子)——I3C协议介绍
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Linux+Windows下安装ffmpeg