【经验】Silicon Labs EFM8单片机STARTUP.A51文件解析

2019-07-18 世强
8bit MCU,8位单片机,8051,EFM8 8bit MCU,8位单片机,8051,EFM8 8bit MCU,8位单片机,8051,EFM8 8bit MCU,8位单片机,8051,EFM8

SILICON LABS EFM8系列MCU特点:高速内核,主频可达72Mhz,70%以上的指令可在1到2个时钟周期完成。数字外设,自主外设降低处理器负载,更快更高精度的PWM输出,高数据吞吐量的快速串行外设。模拟外设,都有高性能ADC,温度传感比较电压调节器,部分系列有DAC、电容传感器。高集成度,最小3x3mm的标准封装,丰富的资源USB、振荡器、电压参考等。超低功耗,睡眠模式低至50nA,2us唤醒时间,有效模式150uA/MHz。免费的Simplicity Studio IDE集成开发环境,免费的KEIL C51编译工具,功耗评估软件,底层配置工具,事例工程和大量资料。


8051设计默认是自动加载这段STARTUP.A51汇编代码,一般要考虑考虑区分上电复位和程序复位的情况。有时候当程序复位时,不希望一些内存单元被清零,需要保留复位前的内容,那么就要对STARTUP.A51做修改了。

 

比如IDATALEN=80H,表示从0~7FH地址长度,如果你把程序改成

IDATALEN EQU 0100H,那么就是对应0~FFH地址长度,程序会根据长度不同循环判断清零内存内容。

 

如果你要修改STARTUP.A51文件,在Simplicity Studio V4环境下创建新的工程会自动拷贝此文件到工程目录下,方便用户修改。删掉此文件则默认加载系统路径下的STARTUP.A51文件。

 

如果调试不能进入main函数,那就不得不对此文件进行修改,复位后立即关闭看门狗定时器功能。避免程序还没执行到应用程序,就被看门狗定时器强制复位了。

 

8051 RAM存储器类型分为三种模式,分别为Small、Compact、Large。
1、内部RAM的低128字节(00-7F)
2、内部RAM的高128字节(80-FF)---【增强型51才有高128字节,例如:EFM8系列】
3、特殊功能寄存器(SFR)(80-FF)
4、外部RAM 64K(0000-FFFF)
data 表示的是内部RAM的低128字节,可以直接寻址,速度比较快。
idata 表示内部RAM高128字节,只能是间接寻址,速度比data里的数据要慢。
pdata是外部RAM中的前256个,也就是外部RAM中的00--FF,只能MOVX 间接寻址,因为可以用R0做为指针,速度与idata是一样的。
xdata是外部RAM的全部,也可以包括前256个,外部RAM前256个,可以用pdata和xdata定义都行。其他内容只能是MOVX 和 DPTR组合寻址,速度最慢。


我们一起来分析STARTUP.A51文件内容:

$NOMOD51   ;Ax51宏汇编器控制命令,禁止预定义的8051符号。使编译器不能使用预定义的8051符号,避免产生重复定义错误。

;------------------------------------------------------------------------------

;  This file is part of the C51 Compiler package

;  Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.

;  Version 8.01

;

;  *** <<< Use Configuration Wizard in Context Menu >>> ***

;------------------------------------------------------------------------------

;  STARTUP.A51:  This code is executed after processor reset.

;

;  To translate this file use A51 with the following invocation:

;

;     A51 STARTUP.A51

;

;  To link the modified STARTUP.OBJ file to your application use the following

;  Lx51 invocation:

;

;     Lx51 your object file list, STARTUP.OBJ  controls

;

;------------------------------------------------------------------------------

;

;  User-defined <h> Power-On Initialization of Memory

;

;  With the following EQU statements the initialization of memory

;  at processor reset can be defined:

;

; <o> IDATALEN: IDATA memory size <0x0-0x100>

;     <i> Note: The absolute start-address of IDATA memory is always 0

;     <i>       The IDATA space overlaps physically the DATA and BIT areas.

IDATALEN        EQU     80H  ;IDATALEN是一个标号,EQU是汇编宏定义,这句代码表示定义了一个IDATA存储区长度宏标号,宏扩展等价于80H。

;

; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>

;     <i> The absolute start address of XDATA memory

XDATASTART      EQU     0    ;定义一个XDATA存储区域的起始地址宏标号。

;

; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>

;     <i> The length of XDATA memory in bytes.

XDATALEN        EQU     0    ;定义一个XDATA存储区域长度宏标号。

;

; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>

;     <i> The absolute start address of PDATA memory

PDATASTART      EQU     0H ;定义一个PDATA存储区域的起始地址宏标号。

;

; <o> PDATALEN: PDATA memory size <0x0-0xFF>

;     <i> The length of PDATA memory in bytes.

PDATALEN        EQU     0H ;定义一个PDATA存储区域的长度宏标号。

;

;</h>

;------------------------------------------------------------------------------

;

;<h> Reentrant Stack Initialization

;再入堆栈的初始化,生长方向取决芯片,一般是自顶向下增长的。而硬件堆栈SP是自下向上增长的。

;  The following EQU statements define the stack pointer for reentrant

;  functions and initialized it:

;函数参数的传递取决于编译器,Keil C51默认情况不是用堆栈来传递参数的,所以造成函数默认情况下不可重入,如果需要函数重入,需要在函数定义后增加reentrant关键字声明。Simplicity Studio V4 提供免费Keil C51 V9.3版本。

; <h> Stack Space for reentrant functions in the SMALL model.

;  <q> IBPSTACK: Enable SMALL model reentrant stack

;     <i> Stack space for reentrant functions in the SMALL model.

IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.

;SMALL 存储器模式,所有变量默认都放在RAM中寄存器直接寻址低128字节。

;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>

;     <i> Set the top of the stack to the highest location.

IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  定义栈顶位置。

; </h>

; <h> Stack Space for reentrant functions in the LARGE model.     

;  <q> XBPSTACK: Enable LARGE model reentrant stack

;     <i> Stack space for reentrant functions in the LARGE model.

XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.

;LARGE 存储器模式,所有变量默认都放在外部XRAM中寄存器DPTR寻址整64K字节。

;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>

;     <i> Set the top of the stack to the highest location.

XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 定义栈顶位置。

; </h>

; <h> Stack Space for reentrant functions in the COMPACT model.   

;  <q> PBPSTACK: Enable COMPACT model reentrant stack

;     <i> Stack space for reentrant functions in the COMPACT model.

PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.

;COMPACT 存储器模式,所有变量默认都放在外部XRAM中寄存器R0寻址低256字节

;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>

;     <i> Set the top of the stack to the highest location.

PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  定义栈顶位置。

; </h>

;</h>

;------------------------------------------------------------------------------

; CIP51有三种存储器模式,不同模式下访问速度和效率不同,根据需要选择。

;  Memory Page for Using the Compact Model with 64 KByte xdata RAM

;  <e>Compact Model Page Definition

;

;  <i>Define the XDATA page used for PDATA variables.

;  <i>PPAGE must conform with the PPAGE set in the linker invocation.

;

; Enable pdata memory page initalization

PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.

;是否使能页寻址模式宏开关,0关闭,1使能。

; <o> PPAGE number <0x0-0xFF>

; <i> uppermost 256-byte address of the page used for PDATA variables.

PPAGE           EQU     0

; 页寻址模式使能后的默认页编号。大多数8051系统采用P2口来支持翻页功能。

; <o> SFR address which supplies uppermost address byte <0x0-0xFF>

; <i> most 8051 variants use P2 as uppermost address byte

PPAGE_SFR       DATA    0A0H    ;定义页地址寄存器地址为0A0H。

;关键字DATA是A51伪指令,表示8051单片机内寄存器的物理地址定义。

; </e>

;------------------------------------------------------------------------------

 

; Standard SFR Symbols

ACC     DATA    0E0H ;定义累加器ACC地址为0E0H

B       DATA    0F0H    ;定义寄存器B地址为0F0H

SP      DATA    81H    ;定义堆栈指针SP地址为81H

DPL     DATA    82H    ;定义DPTL低字节地址为82H

DPH     DATA    83H    ;定义DPTL高字节地址为83H

 

                NAME    ?C_STARTUP    ;定义当前程序的名称

 

 

?C_C51STARTUP   SEGMENT   CODE    ;定义一个可再定位的段符号名和段所在的存储空间,汇编器产生的这个段符号名在BL51/L51连接定位时使用。

?STACK          SEGMENT   IDATA    ;定义一个IDATA段,段名为“?STACK”符合C51编译器标准命名规则。

 

                RSEG    ?STACK   ;声明当前段是IDATA段,段中保留空间,RSEG为指令用于选择一个事先使用SEGMENT为指令声明的普通段。

                DS      1     ;DS是预留空间定义为指令

 

                EXTRN CODE (?C_START) ;声明本模块引用的外部全局符号,?C_START在外部对应C语言的main函数入口。

                PUBLIC  ?C_STARTUP    ;声明全局符号,可以被其他模块引用。

 

                CSEG    AT      0 ;结束当前的IDATA段,产生一个位于CODE存储区的新段,起始地址从0开始。

?C_STARTUP:     LJMP    STARTUP1   ;芯片复位后代码从这里开始执行。

 

                RSEG    ?C_C51STARTUP    ;选择?C_C51STARTUP段为当前段,存储程序代码在CODE区域。

 

STARTUP1:

 

$IF (SILABS_STARTUP = 1);复位重启后是否优先调用SiLabs_Startup函数,通过标识符SILABS_STARTUP = 1来判断,需要在编译器配置汇编语言标识符处定义。请注意默认是被注释了,生效删除IF和ENDIF前的符号$。

EXTRN CODE (SiLabs_Startup)

                LCALL   SiLabs_Startup   ;此函数优先main函数执行,可优先关闭看门狗,以及执行需要在复位后立即处理的程序。

$ENDIF

请特别注意:EFM8单片机默认看门狗是开启状态,程序规模增加,全局变量定义数量增多,预处理时间会加长,会导致调试时无法进入main函数,就被看门狗复位的情况,现象是调试不能停下来,出不了STARTUP.A51汇编代码,附上关闭看门狗C程序如下:

; void SiLabs_Startup(void) {

;  // $[SiLabs Startup]

;  // [SiLabs Startup]$

;  PCA0MD &= ~PCA0MD_WDTE__BMASK; // Disable watchdog timer

;}

IF IDATALEN <> 0    ;条件汇编指令,IDATA长度不等于0,清零IDATA区数据。

                MOV     R0,#IDATALEN - 1

                CLR     A

IDATALOOP:      MOV     @R0,A

                DJNZ    R0,IDATALOOP  ;循环判断,直到IDATA区域全部清零。

ENDIF

 

IF XDATALEN <> 0    ;条件汇编指令,XDATA长度不等于0,清零XDATA区数据。

                MOV     DPTR,#XDATASTART

                MOV     R7,#LOW (XDATALEN)

  IF (LOW (XDATALEN)) <> 0

                MOV     R6,#(HIGH (XDATALEN)) +1

  ELSE

                MOV     R6,#HIGH (XDATALEN)

  ENDIF

                CLR     A

XDATALOOP:      MOVX    @DPTR,A

                INC     DPTR

                DJNZ    R7,XDATALOOP

                DJNZ    R6,XDATALOOP

ENDIF

 

IF PPAGEENABLE <> 0   ;条件汇编指令,判断翻页功能是否有效,非0有效。

                MOV     PPAGE_SFR,#PPAGE

ENDIF

 

IF PDATALEN <> 0    ;判断页数量是否不等于0,非零执行翻页清零数据。

                MOV     R0,#LOW (PDATASTART)

                MOV     R7,#LOW (PDATALEN)

                CLR     A

PDATALOOP:      MOVX    @R0,A

                INC     R0

                DJNZ    R7,PDATALOOP

ENDIF

 

IF IBPSTACK <> 0    ;判断使用再入栈的情况,C51定义了三个全局变量。使用全局变量?C_IBP来存储再入堆栈的栈顶地址。

EXTRN DATA (?C_IBP)   ;函数是Small 存储器模式的时候。

 

                MOV     ?C_IBP,#LOW IBPSTACKTOP

ENDIF

 

IF XBPSTACK <> 0    ;判断使用全局变量?C_XBP来存储再入堆栈的栈顶地址。

EXTRN DATA (?C_XBP)   ;函数是Large 存储器模式的时候。

 

                MOV     ?C_XBP,#HIGH XBPSTACKTOP

                MOV     ?C_XBP+1,#LOW XBPSTACKTOP

ENDIF

 

IF PBPSTACK <> 0    ;判断使用全局变量?C_PBP来存储再入堆栈的栈顶地址。

EXTRN DATA (?C_PBP)   ;函数是Compact存储器模式的时候。

                MOV     ?C_PBP,#LOW PBPSTACKTOP

ENDIF

 

                MOV     SP,#?STACK-1   ;定义的硬件栈常数,区别再入堆栈。定义的段符号?STACK代表该段的首地址。

 

; This code is required if you use L51_BANK.A51 with Banking Mode 4

;<h> Code Banking

; <q> Select Bank 0 for L51_BANK.A51 Mode 4

$IF (USE_BANKING = 1)      ;是否使用bank 0 模式4,默认不使能被注释。

;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.

EXTRN CODE (?B_SWITCH0)

                CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0

$ENDIF

;</h>

                LJMP    ?C_START ;调用应用程序入口,把执行权交给应用程序C语言的main函数。

                END

授权代理商:世强先进(深圳)科技股份有限公司
技术资料,数据手册,3D模型库,原理图,PCB封装文件,选型指南来源平台:世强硬创平台www.sekorm.com
现货商城,价格查询,交期查询,订货,现货采购,在线购买,样品申请渠道:世强硬创平台电子商城www.sekorm.com/supply/
概念,方案,设计,选型,BOM优化,FAE技术支持,样品,加工定制,测试,量产供应服务提供:世强硬创平台www.sekorm.com
集成电路,电子元件,电子材料,电气自动化,电机,仪器全品类供应:世强硬创平台www.sekorm.com
  • +1 赞 0
  • 收藏
  • 评论 0

本文由超哥提供,版权归世强硬创平台所有,非经授权,任何媒体、网站或个人不得转载,授权转载时须注明“来源:世强硬创平台”。

相关研发服务和供应服务

评论

   |   

提交评论

全部评论(0

暂无评论

相关推荐

【经验】如何下载、安装、设置Silicon Labs 8位单片机集成开发环境IDE?

Silicon Labs的8位单片机集成开发环境IDE,简单、容易、强大,是C8051F及EFM8等8位单片机软件开发的强大利器!为了让新手能够快速上手IDE,本将详细接收Silicon Labs IDE的下载、安装、设置等方法。

2018-09-19 -  设计经验 代理服务 技术支持 批量订货

【经验】解析芯科科技8bit MCU EFM8BB5如何使用KEIL开发环境调试烧录

大多使用C8051平台开发的用户都在使用KEIL或IAR开发工具,学习新的SSV5集成开发平台,会投入较多精力和使用习惯问题,不利于产品的快速研发和迭代。故为满足广大用户的需求,本文介绍芯科科技8bit MCU EFM8BB5如何使用KEIL开发环境调试烧录。

2021-11-04 -  设计经验 代理服务 技术支持 批量订货

【经验】8位单片机EFM8的参考电压Vref引脚用于电压输出功能的经验

在某些应用中,需要一路低电流的电源,例如热敏电阻,为了减少LDO的使用,希望使用MCU的Vref输出电压。本文介绍Silicon Labs 8位MCU Vref输出电压使用有什么后果,需要注意什么。

2019-10-30 -  设计经验 代理服务 技术支持 批量订货

【经验】Silicon Labs C8051F系列8bit MCU C2接口编程注意事项

Silicon Labs 8bit MCU C8051F系列采用C2接口进行程序的烧写和软件的调试。本文讲述在使用C2接口进行程序的烧写和软件的调试过程中的注意事项。

2019-01-23 -  设计经验 代理服务 技术支持 批量订货

【经验】8位单片机EFM8系列的SFR Page操作

Silicon Labs的8位单片机EFM8系列,集成丰富的外设,高性能,小封装。软件开发时,由于外设多,寄存器操作引入了SFR Page机制,注意SFR Page设置,防止程序错误,让EFM8系列芯片设计出稳定的优质产品。

2019-04-17 -  设计经验 代理服务 技术支持 批量订货

【经验】解决8位单片机EFM8BB51驱动三相电机过零检测不灵敏的问题

对于简单的8位MCU实现,块换向用于驱动电动机。这种驱动方法需要逆变器电路对根据霍尔传感器给出的转子位置,电机相位电角度每120度的电流或者无传感器方法。本文主要解决8位单片机EFM8BB51F16I-QFN20驱动三相电机过零检测不灵敏的问题。

2023-03-31 -  设计经验 代理服务 技术支持 批量订货

【经验】芯科科技8bit MCU EFM8BB5使用J-Link Commander命令行工厂烧写指南

本文介绍如何使用J-Link Commander命令行烧写Silicon Labs(芯科科技)最新推出的EFM8BB5系列高性价比8bit MCU,方便支持工厂烧写工装的自定义界面设计。

2021-11-12 -  设计经验 代理服务 技术支持 批量订货

【经验】如何计算8位单片机EFM8LB系列PWM最高输出频率?

在电机驱动、电源发生、可调电压发生等应用中,经常需要PWM波,Silicon Labs推出的高性能、高集成度、小体积、高性价比的EFM8LB系列8位单片机,可广泛应用光模块、电机控制等领域,它支持输出PWM波。本文将详细讲解如何计算EFM8LB系列8位单片机PWM最高输出频率。

2020-02-05 -  设计经验 代理服务 技术支持 批量订货

【应用】芯科科技8bit MCU EFM8BB5系列助力水下无人机电调设计,超宽电压输入范围1.8~5.5V

随着无刷电机的大力发展,无刷电调占据了市场的主流。单向有刷电调不能改变信号控制电机反转,双向无刷电调则可以控制电机反转。产品的性能优势和成本是水下无人机企业抢占市场的关键;本文重点介绍芯科科技8bit MCU EFM8BB5系列MCU助力水下无人机电调设计。

2022-08-30 -  应用方案 代理服务 技术支持 批量订货

【经验】8位单片机C2自制烧录器不能用于EFM8问题分析及解决

Silicon Labs公司推出的8位单片机,采用独特的C2调试接口,在占用极少的引脚资源的情况下,实现在线仿真调试,烧录功能,方便软件的开发设计。客户自制C2烧录器,可以更好的用于批量生产。以前用于C8051F系列的自制烧录器如果在EFM8烧写时出现问题,可以根据文章内容进行简单修改,解决烧写问题。

2019-08-02 -  设计经验 代理服务 技术支持 批量订货

【经验】对EFM8系列8位单片机可编程逻辑单元CLU的作用及应用的理解

Silicon Labs的EFM8系列8位单片机,集成了独特数字外设可编程逻辑单元CLU,让EFM8单片机的功能更加强大。那么,这个CLU的作用及应用是什么呢?本文将详细为你解读。

2019-08-21 -  设计经验 代理服务 技术支持 批量订货

【应用】芯科科技8bit MCU EFM8BB5,超宽电压输入范围1.8~5.5V,助力四旋翼无人机电调设计

本文重点介绍Silicon Labs(芯科科技)最新推出90nm高性价比8bit MCU EFM8BB5系列MCU通过控制扬杰科技3颗双N通道MOS管YJG100N04A,调节输出电压而实现的电机调速来控制无人机的飞行速度和飞行姿态,助力四旋翼无人机电调设计。

2021-11-10 -  应用方案
展开更多

电子商城

查看更多

品牌:SILICON LABS

品类:8 BIT MCU

价格:¥3.5305

现货: 85,765

品牌:晟矽微电子

品类:8 位单片机

价格:¥0.2500

现货: 49

品牌:Holychip

品类:通用8位单片机

价格:

现货: 0

品牌:芯海

品类:8位单片机MCU

价格:

现货: 0

品牌:SUMSEMI

品类:无线收发模块

价格:

现货: 0

品牌:晟矽微电子

品类:8 位单片机

价格:¥0.2500

现货: 0

品牌:芯海

品类:8位单片机MCU

价格:

现货: 0

品牌:晟矽微电子

品类:8位单片机

价格:

现货: 0

品牌:晟矽微电子

品类:8位单片机

价格:

现货: 0

品牌:KENTEC DISPLAY

品类:TFT Standard Modules

价格:¥98.7762

现货: 0

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

现货市场

查看更多

品牌:SILICON LABS

品类:8位MCU

价格:¥4.9000

现货:12,000

品牌:RENESAS

品类:microcontroller

价格:¥2.8532

现货:188,410

品牌:RENESAS

品类:microcontroller

价格:¥32.9564

现货:40,179

品牌:RENESAS

品类:microcontroller

价格:¥32.3660

现货:2,192

品牌:RENESAS

品类:MCU

价格:¥6.6987

现货:907

品牌:RENESAS

品类:MCU

价格:¥23.3594

现货:820

品牌:RENESAS

品类:MCU

价格:¥8.5022

现货:250

品牌:RENESAS

品类:microcontroller

价格:¥15.7407

现货:203

品牌:RENESAS

品类:microcontroller

价格:¥44.5695

现货:156

品牌:RENESAS

品类:microcontroller

价格:¥16.7240

现货:153

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

服务

查看更多

TFT LCD液晶显示屏/模组定制

可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。

最小起订量: 1000 提交需求>

MCU烧录/Flash烧录/CPLD烧录

可烧录IC封装SOP/MSOP/SSOP/TSOP/TSSOP/PLCC/QFP/QFN/MLP/MLF/BGA/CSP/SOT/DFN;IC包装Tray/Tube/Tape;IC厂商不限,交期1-3天。支持IC测试(FT/SLT),管装、托盘装、卷带装包装转换,IC打印标记加工。

最小起订量: 1pcs 提交需求>

查看更多

授权代理品牌:接插件及结构件

查看更多

授权代理品牌:部件、组件及配件

查看更多

授权代理品牌:电源及模块

查看更多

授权代理品牌:电子材料

查看更多

授权代理品牌:仪器仪表及测试配组件

查看更多

授权代理品牌:电工工具及材料

查看更多

授权代理品牌:机械电子元件

查看更多

授权代理品牌:加工与定制

世强和原厂的技术专家将在一个工作日内解答,帮助您快速完成研发及采购。
我要提问

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

研发客服
商务客服
服务热线

联系我们

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

投诉与建议

E-mail:claim@sekorm.com

商务合作

E-mail:contact@sekorm.com

收藏
收藏当前页面