韦东山嵌入式linux系列-LED驱动程序

时间:2024-07-09 09:45:36

之前学习STM32F103C8T6的时候,学习过对应GPIO的输出:

操作STM32的GPIO需要3个步骤: 使用RCC开启GPIO的时钟、使用GPIO_Init函数初始化GPIO、使用输入/输出函数控制GPIO口。

【STM32】GPIO输出-****博客

这里再看看STM32MP157的GPIO引脚使用

1 普适的 GPIO 引脚操作方法

GPIO: General-purpose input/output,通用的输入输出口

1.1 GPIO 模块一般结构

⚫ 有多组 GPIO,每组有多个 GPIO
⚫ 使能:电源/时钟
⚫ 模式(Mode):引脚可用于 GPIO 或其他功能
⚫ 方向:引脚 Mode 设置为 GPIO 时,可以继续设置它是输出引脚,还是输入引脚
⚫ 数值:
◼ 对于输出引脚,可以设置寄存器让它输出高、低电平
◼ 对于输入引脚,可以读取寄存器得到引脚的当前电平

1.2 GPIO 寄存器操作

⚫ 芯片手册一般有相关章节,用来介绍: power/clock
        ◼ 可以设置对应寄存器使能某个 GPIO 模块(Module)
        ◼ 有些芯片的 GPIO 是没有使能开关的,即它总是使能的
⚫ 一个引脚可以用于 GPIO、串口、 USB 或其他功能,
        ◼ 有对应的寄存器来选择引脚的功能
⚫ 对于已经设置为 GPIO 功能的引脚,有方向寄存器用来设置它的方向:输出、输入
⚫ 对于已经设置为 GPIO 功能的引脚,有数据寄存器用来写、读引脚电平状态
GPIO 寄存器的 2 种操作方法: 原则:不能影响到其他位

① 直接读写:读出、修改对应位、写入
        a) 要设置 bit n:

val = data_reg;            // 读出来
val = val | (1<<n);        // 1左移n位,再或
data_reg = val;            // 写回去

b) 要清除 bit n:

val = data_reg;
val = val & ~(1<<n);
data_reg = val;

② set-and-clear protocol:
set_reg, clr_reg, data_reg 三个寄存器对应的是同一个物理寄存器,
a) 要设置 bit n: set_reg = (1<<n);
b) 要清除 bit n: clr_reg = (1<<n);

2 STM32MP157 GPIO 操作方法

RCC: Reset and clock control (复位和时钟控制)
GPIO: General-purpose input/output,通用的输入输出口
如下图所示,我们需要操作 LED2 引脚标号为 PA10 LED3 引脚标号为 PG8

2.1 STM32MP157 的 GPIO 模块结构

2.2 RCC 用于设置是否向 GPIO 模块提供时钟

2.3 GPIOx_MODER 配置 GPIO 模式

2.4 GPIOx_OTYPER 配置 GPIO 输出

3 GPIOx_IDR 设置输入 GPIO