本文主要是介绍EFM8SB20 boot_startup 启动文件分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
$NOMOD51
$NOMOD51
$INCLUDE (REG932.INC)
解释:
$NOMOD51,这一指令功能是使A51不识别8051的所有预定义符号。
$INCLUDE (REG932.INC),这一指令功能使用用户自定义的符号文件。
这两条语句必须配合使用,使用了$INCLUDE (REG932.INC),就必须使用$NOMOD51,否则回因多重定义而产生错误。
;
; Copyright (c) 2015 by Silicon Laboratories Inc. All rights reserved.
;
; http://developer.silabs.com/legal/version/v11/Silicon_Labs_Software_License_Agreement.txt
;
#include "efm8_device.h"
#define BL_SIGNATURE 0xA5
NAME BOOT_STARTUP
格式: NAME 模块名
说明: NAME 伪指令用来定义当前的程序模块, 应放在该模块全部伪指令及指令
代码的前面。若无 NAME 伪指令,则源文件名作为系统对其设置的名称,但不
得以数字开始。
PUBLIC boot_otp
PUBLIC ?C_STARTUP
格式: PUBLIC 符号名列表
PUBLIC 伪指令允许当前被汇编模块的符号为外部公用。符号名对于一个
时,用逗号(,)分开。 寄存器或段符号名(通过 SEGMENT 伪指令声明了的)不
可以规定为 PUBLIC。
EXTRN CODE (?C_START)
格式: ERTRN [段类型(符号名列表) ],。。。
说明: EXTRN 伪指令列出当前模块中要访问的在其他模块中定义了的符号。这个
伪指令可以出现在程序的任何地方。外部符号必须符合与上每一个符号相关的
段类型。(这些类型是 CODE,XDATA,DATA,IDATA,BIT 及 NUMBER,即一个无类型的
符号)
; Declare and locate all memory segments used by the bootloader
?BL_EXTRA SEGMENT CODE AT BL_LIMIT_ADDRESS
?BL_START SEGMENT CODE AT BL_START_ADDRESS
?BL_RSVD SEGMENT CODE AT BL_LOCK_ADDRESS-2
?BL_STACK SEGMENT IDATA
格式: 段名 SEGMENT 段类型
说明: SEGMENT 伪指令说明一个段。 段就是一块程序代码或数据存储器。
允许使用的段类型为:
●CODE 代码空间
●DATA 可以直接寻址的内部数据空间
●XDATA 外部数据空间
●IDATA 可以间接寻址的整个内部数据空间
●BIT 位空间
; Create idata segment for stack
RSEG ?BL_STACK
DS 16
格式: 标号 DS 表达式
说明: DS 伪指令以字节为单位保留空间。可以用于除 BIT 类型段以外的任何段。
#if (BL_LIMIT_ADDRESS != BL_START_ADDRESS)
; Create code segment for firmware that doesn't fit in security page
RSEG ?BL_EXTRA
boot_extra:
LJMP ?C_STARTUP
#endif
; Bootloader entry point (boot_vector)
RSEG ?BL_START
?C_STARTUP:
USING 0
; Start bootloader if reset vector is not programmed
MOV DPTR,#00H
将数据指针指向RAM 地址 00H
CLR A
将A清0
MOVC A,@A+DPTR
读取地址00H数据到A,@A+DPTR 指的是DPTR上偏移地址 A ,A= 0,所以地址还是 00H
CPL A
CPL即Converse Position Logical,直接寻址位取反,是一个逻辑运算指令。这是单片机指令,微机汇编语言中没这个指令。使用:CPL A :将累加器A的内容按位逻辑取反,不影响相关标志。
JZ boot_start
JZ(Jump if Zero)是此前的运算结果为0时跳转。
; Start bootloader if software reset and R0 == signature
MOV A,RSTSRC
CJNE A,#010H,pin_test
A中的值是否等于010H,如不相等即跳到pin_test标号所指程序位置,如果相等,程序执行下一行。
MOV A,R0
XRL A,#BL_SIGNATURE
JZ boot_start
; Start the application by jumping to the reset vector
app_start:
LJMP 00H
; Start bootloader if POR|Pin reset and boot pin held low
pin_test:
ANL A,#03H ; A = RSTSRC
ANL 位与运算
ORL 位或运算
JZ app_start ; POR or PINR only
MOV R0,#(BL_PIN_LOW_CYCLES / 7)
?C0001: ; deglitch loop
JB BL_START_PIN,app_start ; +3
指令JA表示 CF=0 且ZF=0 即A>B转移。
指令JB表示 CF=1 且ZF=0 即A <B转移。
DJNZ R0,?C0001 ; +4 = 7 cycles per loop
; Setup the stack and jump to the bootloader
boot_start:
MOV SP, #?BL_STACK-1
LJMP ?C_START
; Reserved Bytes (bl_revision, bl_signature, lock_byte)
RSEG ?BL_RSVD
boot_rev:
DB BL_REVISION
DB是伪指令,告诉编译软件,DB后面的是数据,表格
用于MOVC指令查表用的
boot_otp:
DB BL_SIGNATURE
lock_byte:
DB 0xFF
END
这篇关于EFM8SB20 boot_startup 启动文件分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!