Experimento con lámpara LED nuclear Cortex-A7: STM32MP157

El propósito del experimento: realizar el trabajo de las tres luces LED1 / LED2 / LED3

1. Analizar el diagrama del circuito.

1.idea

El análisis del diagrama del circuito muestra que:

número neto == número pin

LED1 == PE10

LED2 ===>PF10 

LED3 ===> PE8

2. Principio de funcionamiento:

Escribe 1: la luz LED está encendida, escribe 0: la luz LED está apagada

Segundo, el diagrama de bloques.

1. Núcleo A7 y controlador GPIO: a través de la comunicación del bus interno, consulte el manual del chip para saber que el bus es el bus AHB4.

2, (registro de función especial fuera del núcleo): cuando el fabricante del chip sale de fábrica, se solidifica en el espacio de direccionamiento de un extremo dentro del chip y la dirección se fija

3. El núcleo A7 controla el dispositivo de función especial a través de las instrucciones de ensamblaje LDR/STR

4. Analice según el diagrama de bloques:

Capítulo RCC == habilitar el controlador de grupo GPIOE y GPIOF

Capítulo GPIO == 1) Inicializar pin GPIO, 2) Salida de pin nivel alto y bajo

Tres, analiza el capítulo RCC.

1. Determinar la conexión del bus

Consulte el manual del chip: GPIO está conectado a RCC a través del bus AHB4

2. Dirección base

GPIOF: 0x50007000

GPIOE: 0x50006000

RCC: 0x50000000

3. Analizar el registro RCC_MP_AHB4ENSETR

Función: habilitar el registro de grupo GPIO

Dirección: 0x50000000 + 0xA28 = 0x50000A28

Pseudocódigo: RCC_MP_AHB4ENSETR[4] = 1 === GPIOE 

RCC_MP_AHB4ENSETR [5] = 1 === GPIOF

Cuarto, analice el capítulo GPIO.

1. Información general

 2. Diagrama de bloques

 La imagen está corrupta :<

 1. Analizar el registro GPIOx_MODER

Función: configure el modo del pin GPIO (entrada, salida, multiplexación, simulación) para generar niveles altos y bajos en este experimento, seleccione la salida

Dirección: 0x50006000 + 0x00 = 0x50006000 

        0x50007000 + 0x00 = 0x50007000

Pseudocódigo: GPIOE_MODER[21:20] = 01 ==== LED1

        GPIOF_MODER [21:20] = 01 ==== LED2

        GPIOE_MODER [17:16] = 01 ==== LED3

 2. Analizar el registro GPIOx_OTYPER

Tipo de salida push-pull: tanto el tubo PMOS como el tubo NMOS pueden funcionar

Tipo de salida de drenaje abierto: solo pueden funcionar los tubos NMOS

Función: establece el tipo de salida del pin GPIO en salida push-pull

Dirección: 0x50006000 + 0x04 = 0x50006004

0x50007000 + 0x04 = 0x50007004

Pseudocódigo: GPIOE_OTYPER[10] = 0 ==== LED1

        GPIOF_OTYPER [10] = 0 ==== LED2

        GPIOE_OTYPER [8] = 01 ==== LED3

 3. Analizar el registro GPIOx_OSPEEDR

Función: establece la velocidad de salida del pin GPIO (velocidad baja, velocidad media, velocidad alta, rápida)

Dirección: 0x50006000 + 0x08 = 0x50006008

0x50007000 + 0x08 = 0x50007008

Pseudocódigo: GPIOE_OSPEEDR[21:20] = 01 ==== LED1

GPIOF_OSPEEDR [21:20] = 01 ==== LED2

GPIOE_OSPEEDR [17:16] = 01 ==== LED3

 4. Analizar el registro GPIOx_PUPDR

Función: establezca si el pin GPIO necesita resistencias pull-up y pull-down (resistencias pull-up y pull-down, pull-up, pull-down y reservadas) están prohibidas en este experimento.

Dirección: 0x50006000 + 0x0C = 0x5000600C

0x50007000 + 0x0C = 0x5000700C

Pseudocódigo: GPIOE_PUPDR[21:20] = 00 ====LED1

GPIOF_PUPDR [21:20] = 00 ====LED2

GPIOE_PUPDR [17:16] = 00 ====LED3

5. Analizar el registro GPIOx_ODR

Función: Establecer el nivel alto/bajo de salida del pin Escritura 1: Nivel alto de salida, el LED se enciende Escritura 0: Nivel bajo de salida, las luces LED se apagan

Dirección: 0x50006000 + 0x14 = 0x50006014

0x50007000 + 0x14 = 0x50007014

Pseudocódigo: GPIOE_ODR[10] = 1/0 ====LED1

GPIOF_ODR [10] = 1/0 ====LED2

GPIOE_ODR [8] = 1/0 ====LED3

Cinco, registrar el embalaje

1. Paquete de registro único

1、在汇编语言中0x50000A28代表一块地址空间,但是在C语言中表示十六进制数,在C语言中,如何将0x50000A28表示一块地址空间的
    (volatile unsigned int*)0x50000A28  ====> ldr r0,=0x50000A28
2、如何取出0x50000A28这块地址空间中的内容
    (*(volatile unsigned int*)0x50000A28) ====> ldr r1,[r0]
3、将0x50000A28这块地址空间中的第4位进行置1,保证其他位不变
    (*(volatile unsigned int*)0x50000A28)  = (*(volatile unsigned int*)0x50000A28) | (0x1 << 4);  ====> orr r1,r1,#(0x1 << 4)  str r1,[r0]
4、用宏定义如何对寄存器进行封装
    #define RCC_MP_AHB4_ENSETR  (*(volatile unsigned int*)0x50000A28)   
    RCC_MP_AHB4_ENSETR =  RCC_MP_AHB4_ENSETR | (0x1 << 4);
    RCC_MP_AHB4_ENSETR |= (0x1 << 4);
5、将GPIOE/GPIOF寄存器进行封装
    #define GPIOE_MODER  (*(volatile unsigned int*)0x50006000) 
    #define GPIOE_OTYPER  (*(volatile unsigned int*)0x50006004)
    #define GPIOE_OSPEEDR  (*(volatile unsigned int*)0x50006008)
    #define GPIOE_PUPDR (*(volatile unsigned int*)0x5000600C)
    #define GPIOE_ODR  (*(volatile unsigned int*)0x50006014)         

2. Registro de paquete de estructura

typedef struct{
    volatile unsigned int MODER;    //MODER
    volatile unsigned int OTYPER;   //OTYPER
    volatile unsigned int OOSPEEDR;    //OSPEEDR
    volatile unsigned int PUPDR;  //PUPDR
    volatile unsigned int IDR;  //IDR
    volatile unsigned int ODR; //ODR        
}gpio_t;
#define GPIOE    ((gpio_t*)0x50006000)   注释:GPIOE ===> 0x50006000
#define GPIOF    ((gpio_t*)0x50007000)   注释:GPIOF ===> 0x50007000
访问结构体成员:GPIOE->MODER

Supongo que te gusta

Origin blog.csdn.net/MaGuangming001/article/details/132503387
Recomendado
Clasificación