【经验】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 -  设计经验 代理服务 技术支持 现货查询 批量订货

【经验】8位单片机EFM8BB21 串口UART1的配置与调试

UART是单片机中经常要使用到的外设, Silicon Labs EFM8BB21系列8位单片机中有两个UART,分别UART0和UART1,本片文章主要介绍UART1的配置与调试。使用芯科官方推出的开发软件Simplicity Studio配置工具可以很方便的进行寄存器的初始化配置,省去了繁杂的计算。

2019-07-24 -  设计经验 代理服务 技术支持 现货查询 批量订货

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

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

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

【经验】芯科8位单片机EFM8BB51与EFM8BB21的对比分析

由于EFM8BB51的寄存器相对于EFM8BB21做了较多的调整,使用EFM8BB51来替换EFM8BB21,程序将做修改才能在新的MCU上运行,为了方便修改程序,本文针对寄存器进行对比,方便客户有针对性的调整程序。

2023-04-14 -  设计经验 代理服务 技术支持 现货查询 批量订货

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2022-08-30 -  应用方案 代理服务 技术支持 现货查询 批量订货
展开更多

电子商城

查看更多

品牌:SILICON LABS

品类:8 BIT MCU

价格:¥3.9026

现货: 98,205

品牌:晟矽微电子

品类:8 位单片机

价格:¥0.2500

现货: 49

品牌:芯海

品类:8位单片机MCU

价格:

现货: 0

品牌:晟矽微电子

品类:8 位单片机

价格:¥0.2500

现货: 0

品牌:SUMSEMI

品类:无线收发模块

价格:

现货: 0

品牌:Holychip

品类:通用8位单片机

价格:

现货: 0

品牌:KENTEC DISPLAY

品类:TFT Standard Modules

价格:¥98.7762

现货: 0

品牌:晟矽微电子

品类:8位单片机

价格:

现货: 0

品牌:芯海

品类:8位单片机MCU

价格:

现货: 0

品牌:晟矽微电子

品类:8位单片机

价格:

现货: 0

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

现货市场

查看更多

品牌:SILICON LABS

品类:8位MCU

价格:¥4.9000

现货:12,000

品牌:RENESAS

品类:microcontroller

价格:¥2.8532

现货:188,410

品牌:RENESAS

品类:microcontroller

价格:¥32.9564

现货:40,179

品牌:RENESAS

品类:microcontroller

价格:¥2.3120

现货:2,192

品牌:RENESAS

品类:MCU

价格:¥0.6760

现货:907

品牌:RENESAS

品类:MCU

价格:¥23.3594

现货:820

品牌:RENESAS

品类:MCU

价格:¥0.7600

现货:250

品牌:RENESAS

品类:microcontroller

价格:¥2.8460

现货:203

品牌:RENESAS

品类:microcontroller

价格:¥5.5220

现货:156

品牌:RENESAS

品类:microcontroller

价格:¥3.1820

现货:153

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

服务

查看更多

IC烧录代工及IC自动化烧录

拥有IC烧录机20余款,100余台设备,可以烧录各种封装的IC;可烧录MCU、FLASH、EMMC、NAND FLASH、EPROM等各类型芯片,支持WIFI/BT模组PCBA烧录、测试。

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

3C认证/CCC认证

支持微型计算机 、便携式计算机显示设备、投影仪、打印设备、绘图仪、多用途打印复印机、扫描仪、计算机内置电源、电源适配器、充电器、服务器、收款机等产品中国强制性产品认证。

提交需求>

查看更多

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

查看更多

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

查看更多

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

查看更多

授权代理品牌:电子材料

查看更多

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

查看更多

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

查看更多

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

查看更多

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

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

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

收藏
收藏当前页面