【经验】Silicon Labs EFM8单片机STARTUP.A51文件解析
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
- |
- +1 赞 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位单片机EFM8BB51驱动三相电机过零检测不灵敏的问题
对于简单的8位MCU实现,块换向用于驱动电动机。这种驱动方法需要逆变器电路对根据霍尔传感器给出的转子位置,电机相位电角度每120度的电流或者无传感器方法。本文主要解决8位单片机EFM8BB51F16I-QFN20驱动三相电机过零检测不灵敏的问题。
设计经验 发布时间 : 2023-03-31
【经验】8位单片机EFM8的参考电压Vref引脚用于电压输出功能的经验
在某些应用中,需要一路低电流的电源,例如热敏电阻,为了减少LDO的使用,希望使用MCU的Vref输出电压。本文介绍Silicon Labs 8位MCU Vref输出电压使用有什么后果,需要注意什么。
设计经验 发布时间 : 2019-10-30
【经验】8位单片机EFM8系列的SFR Page操作
Silicon Labs的8位单片机EFM8系列,集成丰富的外设,高性能,小封装。软件开发时,由于外设多,寄存器操作引入了SFR Page机制,注意SFR Page设置,防止程序错误,让EFM8系列芯片设计出稳定的优质产品。
设计经验 发布时间 : 2019-04-17
【应用】芯科科技8bit MCU EFM8BB5系列助力水下无人机电调设计,超宽电压输入范围1.8~5.5V
随着无刷电机的大力发展,无刷电调占据了市场的主流。单向有刷电调不能改变信号控制电机反转,双向无刷电调则可以控制电机反转。产品的性能优势和成本是水下无人机企业抢占市场的关键;本文重点介绍芯科科技8bit MCU EFM8BB5系列MCU助力水下无人机电调设计。
应用方案 发布时间 : 2022-08-30
【经验】芯科科技8bit MCU EFM8BB5使用J-Link Commander命令行工厂烧写指南
本文介绍如何使用J-Link Commander命令行烧写Silicon Labs(芯科科技)最新推出的EFM8BB5系列高性价比8bit MCU,方便支持工厂烧写工装的自定义界面设计。
设计经验 发布时间 : 2021-11-12
【经验】Silicon Labs C8051F系列8bit MCU C2接口编程注意事项
Silicon Labs 8bit MCU C8051F系列采用C2接口进行程序的烧写和软件的调试。本文讲述在使用C2接口进行程序的烧写和软件的调试过程中的注意事项。
设计经验 发布时间 : 2019-01-23
【应用】芯科科技8bit MCU EFM8BB5,超宽电压输入范围1.8~5.5V,助力四旋翼无人机电调设计
本文重点介绍Silicon Labs(芯科科技)最新推出90nm高性价比8bit MCU EFM8BB5系列MCU通过控制扬杰科技3颗双N通道MOS管YJG100N04A,调节输出电压而实现的电机调速来控制无人机的飞行速度和飞行姿态,助力四旋翼无人机电调设计。
应用方案 发布时间 : 2021-11-10
【经验】如何计算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
【经验】如何解决8位单片机EFM8BB21F16G串口通信不正常问题?
本文以Silicon Labs的8位单片机EFM8BB21F16G为例,介绍如何通过软件程序置位中断标志位,通过串口中断方式来解决清除前如果有数据到来会引起数据丢失并无法产生中断的方法。
设计经验 发布时间 : 2021-05-19
【应用】8bit MCU EFM8BB21用于玩具无人机主控,QFN20超小封装
玩具无人机是一种消费类玩具产品,有主控模块、无线通信模块、传感模块、电源模块、晶振、电驱、LED、蜂鸣器等,统一由主控MCU来控制。本文将介绍Silicon Labs的8bit MCU EFM8BB21F16G-C-QFN20R在玩具无人机上的应用,超小封装、低功耗、高性价比。
应用方案 发布时间 : 2020-10-26
【经验】通过Fireware更新解决EFM8采用U-EC6调试时出现无法识别MCU的情况
Silicon Labs公司的8位单片机EFM8系列,采用C8051内核,独特的C2调试接口,占用很少的IO口资源,满足了8位单片机仿真调试功能,让单片机更容易开发。当调试时出现无法识别MCU的情况,可以尝试通过Fireware更新来解决。本文详细介绍了更新步骤。
设计经验 发布时间 : 2019-04-17
【经验】基于8位单片机EFM8SB10F实现高精度液位检测的方法
本文根据实际经验,推荐一个基于电容检测原理的方法进行液位检测,主控选用Silicon Labs的EFM8SB10系列8位单片机,集成“电容传感器”单元,可实现16位检测精度,最小分辨单位为1fF,检测量程为0~500pF,实现高精度低成本方案。
设计经验 发布时间 : 2021-03-25
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
可烧录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 提交需求>
登录 | 立即注册
提交评论