EFM8SB20 boot_startup 启动文件分析

2024-06-12 00:58

本文主要是介绍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 启动文件分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1052743

相关文章

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI

Spring Boot 集成 Solr 的详细示例

《SpringBoot集成Solr的详细示例》:本文主要介绍SpringBoot集成Solr的详细示例,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录环境准备添加依赖配置 Solr 连接定义实体类编写 Repository 接口创建 Service 与 Controller示例运行

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实

Spring Boot项目打包和运行的操作方法

《SpringBoot项目打包和运行的操作方法》SpringBoot应用内嵌了Web服务器,所以基于SpringBoot开发的web应用也可以独立运行,无须部署到其他Web服务器中,下面以打包dem... 目录一、打包为JAR包并运行1.打包为可执行的 JAR 包2.运行 JAR 包二、打包为WAR包并运行

Spring Boot 常用注解整理(最全收藏版)

《SpringBoot常用注解整理(最全收藏版)》本文系统整理了常用的Spring/SpringBoot注解,按照功能分类进行介绍,每个注解都会涵盖其含义、提供来源、应用场景以及代码示例,帮助开发... 目录Spring & Spring Boot 常用注解整理一、Spring Boot 核心注解二、Spr