Cree y pruebe el proyecto STM32 en lenguaje ensamblador puro basado en MDK

Creación de proyectos y configuraciones relacionadas

1. Selección de chip:
Inserte la descripción de la imagen aquí
2. El CMSIS de ARM ya ha empaquetado todos los componentes de software necesarios para el desarrollo, así que seleccione directamente y la selección es la siguiente: Inserte la descripción de la imagen aquí
3. Agregue el archivo fuente .s:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Código

 AREA MYDATA, DATA
	
 AREA MYCODE, CODE
	ENTRY
	EXPORT __main

__main
	MOV R0, #10
	MOV R1, #11
	MOV R2, #12
	MOV R3, #13
	;LDR R0, =func01

	BL	func01
	;LDR R1, =func02
	BL	func02
	
	BL 	func03
	LDR LR, =func01
	LDR PC, =func03
	B .
		
func01
	MOV R5, #05
	BX LR
	
func02
	MOV R6, #06
	BX LR
	
func03
	MOV R7, #07
	MOV R8, #08	
	BX LR

Nota: debe haber un espacio antes de la primera línea, de lo contrario se producirá un error

resultado:
Inserte la descripción de la imagen aquí

Configuración del emulador

1. Abra la ubicación:
Inserte la descripción de la imagen aquí
2. Configuración específica, elija la que ha instalado y utilizado por usted mismo
Nota: Primero conecte la placa base
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Compilar prueba

1. Primero compila y luego simula
Inserte la descripción de la imagen aquí

2. Resultado de la prueba: Inserte la descripción de la imagen aquí
3. Observación del archivo HEX
Inserte la descripción de la imagen aquí
Nota:
1) El archivo se encuentra en la carpeta Objetos del directorio donde se creó el proyecto.

2) Para generar un archivo HEX, configure la salida
Inserte la descripción de la imagen aquí
4. Observe los resultados:

1)
Observe el tamaño de cada sección de HEX:
Código: se refiere al número de bytes de código en el programa
RO-data: se refiere al número de bytes constantes definidos en el programa
RW-data: el número de bytes de variables inicializados en el programa
ZI-Data: el número de bytes variables no inicializados en el programa
puede calcular la ocupación de flash y RAM:
flash = código + datos RO + datos RW
ram = datos RW + datos ZI

2). El
primer 0 × 02 indica que hay dos datos en la fila de datos. El
segundo, el tercero 0x00 0x00 indica la dirección inicial de la fila de datos. El
cuarto byte es 0x00 0x01 0x02 0x03 0x04 0x05, respectivamente. tiene los siguientes significados
'00' Registro de datos: utilizado para registrar datos, la mayoría de los registros de archivos HEX son registros de datos.
'01' Registro de fin de archivo: utilizado para marcar el final del archivo, colocado al final del archivo , y marque el final del
archivo HEX '02' Registro de dirección de segmento extendido: el registro utilizado para identificar la dirección de segmento extendido.
'03' Registro de dirección de segmento inicial: el registro de dirección de segmento inicial.
'04' Registro de dirección lineal extendido: el registro utilizado para identificar la dirección lineal extendida.
'05' Iniciar registro de dirección lineal: Iniciar registro de dirección lineal El
último byte 0xf8 es la suma de comprobación. Suma de comprobación = 0x100-suma acumulada. En nodepad ++, si la suma de verificación no es verde, significa que la suma de verificación es incorrecta.

El conductor es demasiado mayor

Al seleccionar la prueba de simulación, puede haber un problema, mostrando el mensaje de que el controlador es demasiado antiguo. En este momento, simplemente siga y haga clic en la actualización automática. Si no funciona, intente desenchufar el chip e insértelo nuevamente . También puede intentar actualizar manualmente y realizar las siguientes operaciones:
1. Busque la carpeta ARM> ST-LINK en la ruta de instalación de kei5.
Inserte la descripción de la imagen aquí
2. Ejecute el archivo de actualización para actualizar manualmente el controlador.
Si falla, desconéctelo nuevamente y vuelva a enchufarlo.

Ejercicios básicos de montaje

1. El propósito del experimento:
usar el ensamblador para completar el programa que hace parpadear un LED cada segundo
2. Crear un proyecto:
Inserte la descripción de la imagen aquí
similar a la operación anterior, así que no lo repetiré aquí.
3. Implementación del código:

LED0 EQU 0x422101a0 
RCC_APB2ENR EQU 0x40021018
GPIOA_CRH EQU 0x40010804



Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp







                AREA    RESET, DATA, READONLY

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                    
                    
                AREA    |.text|, CODE, READONLY
                    
                THUMB
                REQUIRE8
                PRESERVE8
                    
                ENTRY
Reset_Handler 
                BL LED_Init
MainLoop        BL LED_ON
                BL Delay
                BL LED_OFF
                BL Delay
                
                B MainLoop
             
LED_Init
                PUSH {
    
    R0,R1, LR}
                
                LDR R0,=RCC_APB2ENR
                ORR R0,R0,#0x04
                LDR R1,=RCC_APB2ENR
                STR R0,[R1]
                
                LDR R0,=GPIOA_CRH
                BIC R0,R0,#0x0F
                LDR R1,=GPIOA_CRH
                STR R0,[R1]
                
                LDR R0,=GPIOA_CRH
                ORR R0,R0,#0x03
                LDR R1,=GPIOA_CRH
                STR R0,[R1]
                
                MOV R0,#1 
                LDR R1,=LED0
                STR R0,[R1]
             
                POP {
    
    R0,R1,PC}

             
LED_ON
                PUSH {
    
    R0,R1, LR}    
                
                MOV R0,#0 
                LDR R1,=LED0
                STR R0,[R1]
             
                POP {
    
    R0,R1,PC}
             
LED_OFF
                PUSH {
    
    R0,R1, LR}    
                
                MOV R0,#1 
                LDR R1,=LED0
                STR R0,[R1]
             
                POP {
    
    R0,R1,PC}             
             
Delay
                PUSH {
    
    R0,R1, LR}
                
                MOVS R0,#0
                MOVS R1,#0
                MOVS R2,#0
                
DelayLoop0        
                ADDS R0,R0,#1

                CMP R0,#330
                BCC DelayLoop0
                
                MOVS R0,#0
                ADDS R1,R1,#1
                CMP R1,#330
                BCC DelayLoop0

                MOVS R0,#0
                MOVS R1,#0
                ADDS R2,R2,#1
                CMP R2,#15
                BCC DelayLoop0
                
                
                POP {
    
    R0,R1,PC}    
             
                NOP
             END

4. Programa quemado:
Inserte la descripción de la imagen aquí
5. Resultados experimentales:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/rude_dragon/article/details/111797593
Recomendado
Clasificación