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
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