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