Resumen del sistema integrado

1. La estructura de instrucciones de armado incluye un conjunto de instrucciones de armado de 32 bits y un conjunto de instrucciones de pulgar de 16 bits.
La instrucción del brazo debe satisfacer la alineación de los límites de la palabra.
La instrucción del pulgar satisface la alineación de límites de media palabra.
Al ingresar el bit de estado del registro de pulgar Rm desde el brazo, bit [0] = 1, ejecute el salto de instrucción BX Rm.
Cuando el bit de estado [0] del registro de brazo Rm ingresado desde el pulgar es 0, se ejecuta el salto de instrucción BX Rm. Cuando el procesador ingresa al manejo de excepciones, comienza la ejecución desde la dirección del vector de excepción y el sistema ingresa automáticamente al brazo.
Ejemplo: De brazo a pulgar
    LDR R0, = Etiqueta + 1
    BX R0
Ejemplo: De pulgar a brazo
    LDR R0, = Etiqueta
    BX R0

El procesador de brazo admite bytes (8 bits), nibbles (16 bits) y palabras (32 bits).
Formato Big-endian: el byte más alto se almacena en la dirección del byte de almacenamiento más bajo.
Formato Little-endian: el byte más alto se almacena en la dirección del byte de almacenamiento más alto.
Ejemplo: 0x12345678 La dirección inicial es: 0x8000
    Grande: Pequeña:
        0x78 0x8003 0x12
        0x56 0x8002 0x34 
        0x34 0x8001 0x45
        0x12 0x8000 0x78

7 modos manejados por
                            armado: Modo CPSR [4: 0] Propósito:              
                            1000 usuarios Modo de usuario Modo
   privilegiado: {Modo de excepción: {1001 Interrupción rápida FIQ
                            1002 Interrupción normal IRQ
                            1003 Interrupción del software SVC
                            1004 Anular el procesamiento de falla de memoria, realizar memoria virtual y memoria Protección
                            1005 indefinida, procesamiento de comandos indefinidos atrapados}
                            1006 sistema que ejecuta tareas del sistema operativo con privilegios}

El procesador del brazo tiene 37 registros en total, divididos en: 31 registros generales y 6 registros de estado.
El programa de procesamiento de FIQ no necesita guardar y restaurar el sitio de la interrupción, por lo que el proceso de procesamiento de la interrupción de FIQ es más rápido.
R13 (SP): Se llama puntero de pila SP. Cuando el programa de aplicación inicializa cada modo de excepción, debe inicializar R13 en este modo para apuntar a la pila correspondiente. Al
           salir del modo de excepción, se guardará en el puntero R13 Se abre el valor del registro en la pila.
R14 (LR): Usado para almacenar la dirección de retorno de la subrutina Después de la ejecución, copie el valor de R14 a la pc y la subrutina puede regresar.
R15 (PC): escriba un valor de dirección en R15 y el programa saltará a esta dirección.
Registro de estado: CPSR, SPSR
            CPSR 1, 4 indicadores de código de condición: negativo, cero, acarreo, desbordamiento
                2 , 2 bits de prohibición de interrupción
                3, 5 bits codificados
                4, 1 brazo indicador o pulgar
            NZCV --- IFT M4 M3 M2 M1 M0
            Bandera de código de condición Bit reservado Bit de control

Tabla de direcciones de vector anormal: Tipo de interrupción anormal Tipo de
dirección Ingresar modo Ingresar estado I Ingresar estado F Prioridad
0x0000 0000 Restablecer gestión Deshabilitar Deshabilitar 1
0x0000 0004 Instrucción no definida No definido Deshabilitar F 6
0x0000 0008 Gestión SWI F 7
0x0000 000C Abortar Abortar F 5
0x0000 0010 Datos cancelados Abortar F 2
0x0000 0014 Reservado Reservado F               
0x0000 0018 Interrupción IRQ F 4
0x0000 001C Interrupción rápida FIQ Desactivar Desactivar 3

S3C2440 se divide en tres partes: arm902T, bus AHB, bus APB.
Microprocesador RISC de núcleo ARM920t de 16 bits / 32 bits.
AHB se utiliza para conectar módulos de sistema de alta frecuencia y alto rendimiento.
APB proporciona una interfaz más sencilla con periféricos lentos y de bajo rendimiento.
Sumador ADC con acarreo
ADD sumador
Y lógica y
salto de bifurcación
BIC bit borrado
BL con conexión salto de
bifurcación BX salto de conmutación de estado y bifurcación
Coprocesador CDP procesamiento de datos
CMN comparación de números negativos Comparación de
CMP
lógica EOR XOR
LDC Cargue datos digitales, desde la memoria al coprocesador, el coprocesador carga
LMD para cargar datos digitales, desde la memoria a múltiples registros, operación de pila

Direccionamiento de registros:
MOV R1, R2; R1 <R2
SUB R0, R1, R2; R0 <R1-R2

Direccionamiento inmediato:
ADD R0, R0, # 1; R0 <R0 + 1
MOV R0, # 0XFF00; R0 <0XFF00

Direccionamiento de cambio de registro:
MOV R0, R2, LSL # 3; R0 <R2 << 3
ADD R3, R2, R2, LSR # 2; R3 <R2 + R1 >> 2

Registro de direccionamiento indirecto:
LDR R0, [R1]; R0 <- [R1]
STR R0, [R1]; [R1] <- R0

Dirección base más dirección de compensación
antes del cambio de dirección: LDR R0, [R1, # 4]; R0 <- [R1 + 4]
Cambio automático de dirección: LDR R0, [R1, # 4]!; R0 <- [R1 + 4], R1 <- R1 + 4
! Función de indexación automática
Modo de indexación posterior: LDR R0, [R1], # 4; R0 <- [R1] para transmitir datos, R1 <- R1 + 4 para transmitir dirección
Ejemplo:
    LDR R0 , [R1, R2]; R0 <- [R1 + R2]
    LDR R0, [R1, R2, LSL # 2]; R0 <- [R1 + R2 * 4]

Instrucción de transferencia de datos MOV
MOV R1, R2; transfiera el valor del registro R0 al registro R1, lo mismo que
MOV PC, R14
MOV R1, R0, LSL # 3

Transmisión de datos inversa: MVN
MVN R0, # 0; Invertir 0 y transmitir a R0

Instrucción de comparación: CMP
CMP R1, R0; reste R1 y R0 y configure la bandera CPSR de acuerdo con el resultado

Borre el bit
BIC BIC R0, R0, # 0XB; borre los bits 0, 1, 3 en R0 y el resto permanecerá sin cambios

B salto
CMP R1, # 1; el valor de R1 menos 0, establece la
etiqueta BEQ de la bandera CPSR ; salto condicional, cuando la bandera Z de CPSR está establecida, el programa salta a la etiqueta

Transferir instrucción BX con cambio de estado
Si el bit más bajo en Rn es 1, establezca el indicador T de CPSR en 1 y cambie al conjunto de instrucciones Thumb
MOV R6, # 0X8000
BX R6; cambie a la instrucción Thumb en la dirección 0x8000

La instrucción de transferencia BL
BL Lable con retorno ; el programa salta incondicionalmente a Lable para su ejecución y guarda el valor de PC en R14 al mismo tiempo.

Transferir instrucción BLX con retorno y retorno estatal

Multiplicar instrucciones y multiplicar-sumar instrucciones (MUL, MLA)
MUL R0, R1, R2; R0 = R1 * R2
MULS R0, R1, R2; R0 = R1 * R2 Al mismo tiempo, configure los indicadores relacionados con CPSR
MLA R0, R1, R2, R3 ; R0 = R1 * R2 + R3
MLAS R0, R1, R2, R3; R0 = R1 * R2 + R3 al mismo tiempo establece el bit de bandera relevante de CPSR

Instrucciones de multiplicación largas (SMULL, UMULL)
SMULL representa operaciones de multiplicación con signo de 64 bits:
SMULL R0, R1, R2, R3, R4; R0 = los 32 bits inferiores de (R2 * R3), R1 = los 32 bits superiores de (R2 * R3) Bit
UMULL significa multiplicación con signo de 64 bits:
UMULL R0, R1, R2, R3, R4; R0 = los 32 bits inferiores de (R2 * R3), R1 = los 32 bits superiores de (R2 * R3)

Comando de carga de datos de palabra: LDR, hay un ejemplo anterior.
Comando de carga de datos de byte: LDRB
LDRB R0, [R1]; Lea los datos de byte con la dirección de memoria R1 en el registro R0 y borre los 24 bits superiores de
R0 a 0 LDRB R0, [R1, # 8]; Lea los datos de bytes de la dirección de memoria R1 + 8 en el registro R0 y borre los 24 bits superiores de R0 a 0.
Instrucción de carga de datos de media palabra: LDRH
LDRH R0, [R1]; Establezca la dirección de memoria en Leer los datos nibble de R1 en el registro R0 y borrar los 16 bits superiores de
R0 a 0 LDRH R0, [R1, # 8]; leer los datos nibble con la dirección de memoria de R1 + 8 en el registro R0 y configurar R0 Borre los 16 bits superiores de
R0 LDRH R0, [R1, R2]; lea los datos nibble con la dirección de memoria R1 + R2 en el registro R0 y borre los 16 bits superiores de R0 a 0

Instrucciones de almacenamiento de datos de palabra: STR
STR R0, [R1], # 8; R1 <- R0 para transferir datos, R1 <- R1 + 8 para transferir la dirección
STR R0, [R1, # 8]; R1 + 8 <- R0
byte de datos Instrucción de almacenamiento: STRB transfiere los datos de bytes inferiores de 8 bits en el registro de origen a la memoria
STRB R0, [R1]
STRB R0, [R1, # 8]
Almacenamiento de datos de media palabra: STRH transfiere el byte de 16 bits en el registro de origen Los datos se transfieren a la memoria
STRH R0, [R1]
STRH R0, [R1, # 8]

Instrucción de intercambio de datos de palabra: SWP
SWP R0, R1, [R2]; R0 <- R2, R2 <- R1
Instrucción de intercambio de datos de bytes: SWPB alto Se borran 24 bits, bajo se intercambian 8 bits
SWPB R0, R1, [R2]; R0 <- R2, R2 <- R1

Transferencia de datos del registro de estado del programa al registro del programa general: MRS
MRS R0, CPSR; R0 <- CPSR
MRS R0, SPSR; R0 <- Transferencia de
datos del SPSR desde el registro del programa general al registro de estado del programa: MSR
MSR CPSR, R0; CPSR <- R0
MSR SPSR, R0; SPSR <- R0
MSR CPSR_C, R0; CPSR <- R0 solo modifica el campo de bit de control

 

El microprocesador ARM puede admitir 16 coprocesadores,
1, instrucciones de manipulación de datos: CDP
CDP P2,5, C12, C10, C3, 4; complete la inicialización del coprocesador p2, deje que p2 realice operaciones en c10, c3 5 Y 4, y almacena el resultado en c12.
2. Instrucción de carga de datos: LDC P5, C3, [R0]; P5's C3 <- R0
3, instrucción de almacenamiento de datos: STC P8, C8, [R2, # 4] !; (R2 +4) <- P8's C8 , R2 <- R2 + 4
4, la instrucción de transferencia de datos desde el registro al coprocesador: MCR
MCR P3,3, R0, C4, C5,6; los datos en R5 se transfieren a C4 y C5 de P3
5, el coprocesador Instrucciones de transferencia de datos al registro: MRC
MRC P15,2, R5, C0, C2,4; los datos del registro P15 se transfieren a R5, C0, C2 son los registros del coprocesador, que almacenan el operando original, y el código de operación 1 es I. El código de operación 2 es 4.

Interrupción de software: SWI
MOV R0, # 34; establecer el número de función en 34
SWI 12; generar interrupción de software, el número de interrupción es 12

Indicador de definición de símbolo:
GBLA define variables aritméticas globales, inicializadas a 0
GBLL define variables lógicas globales, inicializadas a falso
GBLS define variables de cadena globales, inicializadas a NULL
Ejemplo: GBLS S1; declara variable de cadena global S1
declaración de variable local:
LCLA
LCLL
LCLS;
Establezca el valor de la variable como se
indicó anteriormente : SETA
SETL
SETS; el significado es el mismo que el anterior.
Ejemplo: S1 SETS "cadena"
Asigne al nombre del símbolo un valor constante:
num2 EQU 25; Asigne un valor de 25 al símbolo num2

ADR es una pseudoinstrucción de lectura de dirección de rango pequeño, que lee el valor de la dirección en función del desplazamiento relativo de la PC en el registro. Lo que obtiene ldr es el valor de la memoria, direccionamiento indirecto como un puntero.
test1
MOV r1, # 0
ADR r2, test1; generar una instrucción SUB, cargar las direcciones test1 a r2,
los dos propósitos principales de usar LDR, 1 es cuando el valor de un valor inmediato está fuera de rango, las instrucciones MOV y MVN no se pueden usar Al cargar en el registro, use la instrucción LDR para generar una constante de grupo literal, 2 es cargar un programa relativo o una dirección externa en un registro.
Los comandos en lenguaje ensamblador no pueden combinarse entre mayúsculas y minúsculas.
PC significa contador de programa y la canalización utiliza tres etapas, por lo que las instrucciones se ejecutan en tres etapas:
1. buscar (cargar una instrucción de la memoria); 2. decodificar (identificar la instrucción que se ejecutará); 3. ejecutar (procesar Instrucción y escribir el resultado en el registro).
Y R15 (PC) siempre apunta a "buscar" instrucciones, no a "ejecutar" instrucciones o "decodificar" instrucciones.
En términos generales, la gente acuerda habitualmente tomar "la instrucción que se está ejecutando como punto de referencia" y llamarla la primera instrucción actual, por lo que el PC siempre apunta a la tercera instrucción.
En el estado ARM, cada instrucción tiene 4 bytes de longitud, por lo que la PC siempre apunta a la dirección de la instrucción más 8 bytes, es decir: valor de PC = posición de ejecución del programa actual + 8;

El procesador integrado S3C2440 puede funcionar a una frecuencia de reloj de 400 MHZ, por lo que una unidad de gestión de reloj está integrada en el chip, que se compone principalmente de un bucle de bloqueo de fase y un divisor de frecuencia.
Las señales de reloj dentro del chip S3C2440 son FCLK, HCLK y PCLK.
S3C2440 tiene dos bucles bloqueados de fase: MPLL y UPLL. MPLL genera tres tipos de señales: FCLK, HCLK, PCLK, FCLK se usa para arm920T, HCLK se usa para el bus AHB, PCLK se usa para el bus APB
, la señal de reloj generada por el bucle de bloqueo de fase USB UPLL UCLK se usa para USB, UPLL está dedicado para dispositivos USB
/ * Configuración MPLLCON (0x4C000004) = (92 << 12) | (1 << 4) | (1 << 0) 
     * m = MDIV + 8 = 92 + 8 = 100
     * p = PDIV + 2 = 1 + 2 = 3
     * s = SDIV = 1
     * FCLK = 2 * m * Fin / (p * 2 ^ s) = 2 * 100 * 12 / (3 * 2 ^ 1) = 400M 

 

  Inicialización del reloj del sistema

 

Configuración básica después de iniciar el sistema:
ldr r0, = 0x53000000 // Apagar el temporizador de vigilancia
    ldr r1, = 0
    str r1, [r0]
    / * Establecer MPLL, FCLK: HCLK: PCLK = 400m: 100m: 50m * /
    / * LOCKTIME (0x4C000000) = 0xFFFFFFFF * /// Establece el valor predeterminado
    ldr r0, = 0x4C000000
    ldr r1, = 0xffffffff
    str r1, [r0]
   / * CLKDIVN (0x4C000014) = 0X5, tFCLK: tHCLK: tPCLK = 1: 4: 8 * /// Establecer las tres relaciones básicas
    ldr r0, = 0x4C000014
    ldr r1, = 0x5
    str r1, [r0]
    / * Establecer la CPU para que funcione en modo asíncrono * /
    mrc p15,0, r0, c1, c0,0
    orr r0, r0, # 0xc0000000 // R1_nF: OR: R1_iA
    mcr p15,0, r0, c1, c0,0
    / * Establecer MPLLCON (0x4C000004) = (92 << 12) | (1 << 4) | (1 < <0) 
     * m = MDIV + 8 = 92 + 8 = 100
     * p = PDIV + 2 = 1 + 2 = 3
     * s = SDIV = 1
     * FCLK = 2 * m * Fin / (p * 2 ^ s) = 2 * 100 * 12 / (3 * 2 ^ 1) = 400M
     * /
    ldr r0, = 0x4C000004 // 设置 fclk
    为400MHZ ldr r1, = ((92 << 12) | (1 << 4) | (1 << 0))
    str r1, [r0]

    / * Una vez que se establece el PLL, el tiempo de bloqueo se bloqueará hasta que la salida de PLL sea estable
     * Entonces la CPU funciona a la nueva frecuencia FCLK
     * /
    
    

    / * Establece la memoria: sp stack * /
    / * La distinción es nor / nand start
     * Escribe la dirección 0 a 0, y luego léelo
     * Si obtienes 0, significa que el contenido en la dirección 0 ha sido modificado, corresponde a ram, esto es nand start
     * De lo contrario, comience con nor
     * /
    mov r1, # 0
    ldr r0, [r1]
    str r1, [r1]
    ldr r2, [r1]
    cmp r1, r2
    ldr sp, = 0x40000000 + 4096
    streq r0, [r1]
    bl main
halt :
    b detener

Frecuencia de reloj del temporizador = PCLK / ((preescalador de 8 bits + 1) * valor del divisor de reloj)
La función de doble búfer de TCNTBn y TCMPBn garantiza que el temporizador produzca una salida estable cambiando la frecuencia y el ciclo de trabajo.
TCMPBn realiza el ancho de pulso PWM y TCNTBn determina la frecuencia.
Frecuencia de funcionamiento del temporizador de vigilancia = PCLK / ((valor de preescala + 1) / factor de división)


El controlador de almacenamiento de S3c2440 incluye las siguientes características:
1. El sistema admite el formato de almacenamiento de datos endian grande / pequeño
2. El espacio de almacenamiento está dividido en 8 bancos, cada banco tiene 128 MB de espacio y el espacio total direccionable es de 1 GB. Utilice nGCS0 ~ nGCS7 sirve como la señal de selección de banco correspondiente.
3. Excepto el banco0, se puede acceder a todos los demás bancos mediante programación, con anchos de 8, 16, 32 bits.
4. Bank1 ~ bank5 puede usar ROM y SRAM, bank6 y 7 pueden usar ROM / SRAM / SDRAM
5. Bank0 ~ bank6 La dirección de inicio es fija, la dirección de inicio de Bank7 y el tamaño son programables.
El sistema de almacenamiento generalmente se compone de Flash (memoria flash) y SDRAM.
Tampoco características flash: pequeña capacidad, alto costo, alta confiabilidad, corta vida útil y alta velocidad de lectura. El sistema puede ejecutar comandos directamente en norflash para iniciar y arrancar el sistema. Se utiliza principalmente para almacenar código de inicio.
nandflash: gran capacidad, bajo precio, larga vida, velocidad de escritura rápida, no se puede usar para la memoria principal, solo se puede leer y escribir por sector, se puede usar como un disco duro pequeño. Se utiliza principalmente para almacenar datos y programas. También puede iniciar y arrancar el sistema desde nandflash y ejecutar el programa principal en SDRAM.
Por lo general, utilice bank6 y bank7 como área de almacenamiento de SDRAM en el sistema de hardware integrado.
El bus de datos del banco0 se puede configurar en anchos de 16 y 32 bits. Bank0 se usa como una ROM de arranque, asignada a 0x00000000. Por lo tanto, el ancho del bus del banco0 se determina en el primer acceso a la ROM, y el método es a través del nivel lógico de OM [1: 0] en el reinicio.
Cuando se inicia nandflash, el controlador nandflash copiará automáticamente los primeros datos de 4K a SRAM y asignará los datos de SRAM a nGCS0 (0x000000000). El sistema arranca desde SRAM
Inicio de Norflash: los pines OM1 y OM0 deben configurarse de acuerdo con el ancho de bit de norflash. Cuando el ancho de bit es de 16 bits, OM1 y OM0 deben ser bajo y alto respectivamente, y viceversa cuando el ancho de bit es de 32 bits. En este momento, norflash se asigna a la dirección 0x00000000

 

Supongo que te gusta

Origin blog.csdn.net/qq_38531460/article/details/103103554
Recomendado
Clasificación