一、实现原理分析

本次实验使用开发板为:SRM32MP157A-FSMP1A,

LED灯丝印为:LD1、LD2、LD3,通过查询电路图可知其对应引脚为:LD1->PE10、LD2->PF10、LD3->PE8

由于控制LED通断的三极管采用的是NPN结构,所以只要给基极高电平,即给PE10、PF10、PE8三个引脚高电平,LED即可亮起

二、芯片手册分析

2.1框图分析:

软件编程控制硬件思想:内核是通过向特殊功能寄存器中书写和读取值,来控制外设进行工作

GPIO控制器:通用的输入输出控制器

RCC控制器:SOC的心脏,对其他控制器进行使能

实现步骤:

1.使用RCC寄存器对GPIO控制器进行使能

2.配置GPIO寄存器

2.1.MODEL改为输出模式

2.2.OTYPER改为推挽输出

2.3.OSPEEDR输出速率为低速

2.4.PUPDR.不需要上拉电阻

2.5.ODR. 输出数据寄存器,通过输出高低电平来控制LED亮灭

三、代码实现

3.1:头文件:

#ifndef __GPIO_H__#define __GPIO_H__#include "stm32mp1xx_rcc.h"#include "stm32mp1xx_gpio.h"#define PIN_8 8#define PIN_10 10//引脚对应GPIO初始化void hal_gpio_init();//写函数,控制高低电平输出void hal_gpio_write();#endif

功能文件:

#include "gpio.h"//引脚对应GPIO初始化void hal_gpio_init(gpio_t* GPIO_Temp,unsigned int Pin){//RCC使能GPIOE/GPIOFRCC->MP_AHB4ENSETR |= (0X1 <MP_AHB4ENSETR |= (0X1 <MODER &= (~(0x3 <MODER |= (0X1 <OTYPER &= (~(0X1 <OSPEEDR &= (~(0x3 <PUPDR &= (~(0X3 <ODR &= (0x1 <ODR &= (~(0X1 <ODR |= (0X1<<Pin);}}

主函数

#include "gpio.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(){hal_gpio_init(GPIOE,PIN_8); // LED灯初始化hal_gpio_init(GPIOE,PIN_10); // LED灯初始化hal_gpio_init(GPIOF,PIN_10); // LED灯初始化while(1){hal_gpio_write(GPIOE,PIN_10);delay_ms(500);hal_gpio_write(GPIOE,PIN_8);delay_ms(500);hal_gpio_write(GPIOF,PIN_10);delay_ms(500);}return 0;}

四:功能测试

1.执行make语句后生成 .bin文件

2.在串口执行程序

2.1在交互模式下输入 loadb c0008000

2.2 将.bin文件拖入串口工具窗口内,选取send Kermit

2.3 输入 go c0008000

3, 实验现象