一、实现原理分析
本次实验使用开发板为: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/GPIOF
RCC->MP_AHB4ENSETR |= (0X1 <<4);
RCC->MP_AHB4ENSETR |= (0X1 <<5);
//设置GPIO控制器
//输出模式 01
GPIO_Temp->MODER &= (~(0x3 << Pin*2));
GPIO_Temp->MODER |= (0X1 << Pin*2);
//推挽输出 0
GPIO_Temp->OTYPER &= (~(0X1 << Pin));
//低速 00
GPIO_Temp->OSPEEDR &= (~(0x3 <<Pin*2));
//禁止上下拉 00
GPIO_Temp->PUPDR &= (~(0X3 <<Pin*2));
}
//写函数,控制高低电平输出
void hal_gpio_write(gpio_t *GPIO_Temp,unsigned int Pin)
{
if(GPIO_Temp->ODR &= (0x1 <<Pin))
{
GPIO_Temp->ODR &= (~(0X1 << Pin));
}else
{
GPIO_Temp->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, 实验现象