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:
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:
3. Agregue el archivo fuente .s:
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:
Configuración del emulador
1. Abra la ubicación:
2. Configuración específica, elija la que ha instalado y utilizado por usted mismo
Nota: Primero conecte la placa base
Compilar prueba
1. Primero compila y luego simula
2. Resultado de la prueba:
3. Observación del archivo HEX
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
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.
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:
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:
5. Resultados experimentales: