最近要用STC单片机写个程序,但STC在KEIL的单片机库中没有,就随便找了个代替,但是刚好找到的keil没有添加StartUp.A51文件,刚开始时候写程序调程序也没什么,挺正常。但后来越来越奇怪,经常上电时出错,找了很久才发现有个变量没有初始化为0。忽然发觉是不是keil上电时没有帮我清空内存空间!一看才知道没有StartUp.A51文件。加上后,设置内部空间及外部空间地址,一切正常。足足浪费了我一天的时间。 由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下: ;--------------------------------------------------- ;startup.A51: 用户上电初始化程序 ;---------------------------------------------------- ; ;使用以下EQU命令可定义在CPU复位时需要用0进行初始化的内存空间 ; ;IDATA存储器的空间的绝对起始地址总是零 IDATALEN EQU 80H ;需用0进行初始化的IDATA存储器空间的字节数 ; XDATASTART EQU 0H ;XDATA存储器空间的绝对起始地址 XDATALEN EQU 0H ;需用0进行初始化的XDATA存储器的空间字节数 ; PDATASTART EQU 0H ;PDATA存储器的空间的绝对起始地址 PDATALEN EQU 0H ;需用0进行初始化的PDATA存储器的空间字节数 ;注意:IDATA存储器的空间在物理上包括了8051单片机的DATA和BIT存储空间 ;至少要保证与C51编译器运行库有关的存储器的空间进行0初始化 ; ;再入函数模拟初始化 ;----------------------------------------------------------- ;以下用EQU指令定义了再入函数模拟堆栈指针的初始化 ; ;使用SMALL存储器模式时再入函数的堆栈空间 IBPSACK EQU 0 ;使用SMALL存储器模式再入函数时将其设置成1 IBPSTACKTOP EQU 0FFH+1 ;将堆栈顶设置为最高地址加1 ; ;使用LARGE存储器模式时再入函数的堆栈空间 XBPSTACK EQU 0 ;使用LARGE存储器模式再入函数时将其设置成1 XBPSTACKTOP WQU 0FFFFH+1 ;将堆栈顶设置为最高地址加1 ; ;使用COMPACT存储器模式时再入函数的堆栈空间 PBPSTACK EQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1 PBPSTACKTOP WQU 0FFFFH+1 ;将堆栈顶设置为最高地址加1 ;;---------------------------------------------------- ;使用COMPACT存储器模式时,64KB X DATA存储器空间的分页定义 ; ;以下用EQU指令定义PDATA类型变量在XDATA存储器空间的页地址 ;使用EQU指令定义PFAGE时必须与L51连接定位器PDATA指令的控制参数一致
; PPAGEENABLE EQU 0 ;使用PDATA类型变量时将其设置成1 PPAGE EQU 0 ;定义页号 ; ;------------------------------------------------ NAME ? C_STARTUP ;模块名为 ? C_STARTUP ? C_51STARTUP SEGMENT CODE ;代码段 ? STACK SEGMENT IDATA ;堆栈段 RSEG ? STACK ;堆栈 DS 1 EXTRN COE(? C_START) ;程序开始地址 PUBLIC ? C_STARTUP CSEG AT 0x8000 ;定义用户程序的起始地址,用MON51仿真器时可能有用 ? C_STARTUP: LFMP STARTUP1 RSEG ? C_51STARTUP STARTUP1: ; ;初始化串口 MOV SCOM, #40H MOV TMOD, #20H MOV TH1, #0FDH SETB TR1 CLR T1 ;单片机上电IDATA内存清零,如果不需要上电清零IDATA,可以注销IF到IFEDN之间的 ;语句,或者修改IDTALEN的长度,为了让CPU具有掉电保护功能,需要确定IDTALEN的长度 IF IDATALEN <> 0 MOV R0, # IDATALEN-1 CLR A IDATALOOP: MOV @R0,A DJNZ R0,IDATALOOP ENDIF ; ;单片机上电XDATA内存清零,如果不需要上电清零XDATA,可以注销IF到IFEDN之间的 ;语句,或者修改XDTALEN的长度 IF XDATALEN <> 0 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 END IF ; ;送PDATA存储器页面高位地址 IF PPAGEENABLE <> 0 MOV P2, #PPAGE ENDIF ; ;单片机上电PDATA内存清零,如果不需要上电清零XDATA,可注销IF到IFEDN之 ;间的语句或者修改PDATALEN的长度 IF PDATALEN <> 0 MOV R0, #PDATASTART MOV R7, #LOW (PDATALEN) CLR A PDATALOOP: MOV @R0, A INC R0 DJNZ R7,PDATALOOP ENDIF ; ;设置使用SMALL存储器模式时再入函数的堆栈空间 IF IBPSTACK <> 0 EXTRN DATA(? C_IBP) MOV ? C_IBP, #LOW IBPSTACKTOP ENDIF ; ;设置使用LARGE存储器模式时再入函数的堆栈空间 IF XBPSTACK <> 0 EXTRN DATA (? C_XBP) MOV ? C_XBP, #HIGH XBPSTACKTOP MOV ? C_XBP +1, #LOW XBPSTACKTOP ENDIF ; ;设置使用COMPACT存储器模式时再入函数的堆栈空间 IF PBPSTACK <> 0 EXTRN DATA(? C_PBP) MOV ? C_PBP, #LOW PBPSTACKTOP END IF ; ;设置堆栈的起始地址 MOV SP, #? STACK-1 ;例如 MOV SP, #4FH ; ;如果程序超过64K,则使用程序分组技术,启动下面的程序
;EXTRN CODE(? B_SWITCH0) ;CALL ? B_SWITCH0 ;程序从第一组bank 0 块开始执行 ;跳转到用户程序MAIN函数 LJMP ? C_START END startup.a51的作用和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char data xxx="100";,那startup.a51 中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51==变量的初始化)。 这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。 有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量, 但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性
关键字:keil StartUp.A51
引用地址:
keil中StartUp.A51的重要性
推荐阅读最新更新时间:2024-03-16 14:58
用Keil C51开发串行口
MCS-51单片机的串行口具有两条独立的数据线 发送端TXD和接收端RXD,它允许数据同时往两个相反的方向传输。一般通信时发送数据由TXD端输出,接收数据由RXD端输入。 MCS-51单片机的串行口既可以用于网络通信,亦可实现串行异步通信,还可以用作同步移位寄存器。如果在串行口的输入输出引脚上加上电平转换器,就可方便地构成标准的RS-232接口。 MCS-51单片机的串行接口是一个全双工通信接口,它有两个物理上独立的接收、发送缓冲器SBUF,可以同时发送和接收数据。但是发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。两个缓冲器共用一个地址(99H)。 1 数据通信的基本概念 常用于数据通信的传输方式有单工、半双工、
[单片机]
Keil(MDK-ARM)系列教程(一)_新建软件工程详细过程
Ⅰ、写在前面 本文使用目前(2016年11月)最新版本Keil(MDK-ARM)V5.21a开发环境、以STM32的处理器为例给大家讲述新建一个软件工程的详细过程。 Keil(MDK-ARM)V4和V5新建软件工程基本一样,本文也适合与V4版本的新建软件工程。 本文使用的处理器是ST公司的STM32F1系列芯片,ST公司其它系列(如:F4等)、其它公司(如:TI)新建软件工程的过程也是一样。 为方便广大STM32学习者,我将在下面把STM32F0 - F4各个系列芯片新建好的Demo软件工程、相关的工具和文档提供给大家下载。 本文内容已经整理成PDF文件,提供给大家下载: http://pan.baidu.co
[单片机]
劝君慎用KEILC51九级优化
简介:有时程序才4K多一点,或者8K多一点,32K多一点,64K多一点,总会想方设法去优化压缩代码,以便放到更低成本的芯片中去,可是这时问题可能就出现了! 有时程序才4K多一点,或者8K多一点,32K多一点,64K多一点,总会想方设法去优化压缩代码,以便放到更低成本的芯片中去,可是这时问题可能就出现了! KEILC51九级优化可以将程序中相同的代码段归为一段,从而大幅度缩减程序代码。可是这一级优化却是没有保障的,优化后,经常会产生各种错误,特别是常量代码段被搞到乱七八糟,一些隐形的bug也从此悄悄伏下,如中断错误,待到你发现有问题还模不清头脑!假如你是在准备生产时才将C51编译提高到9级优化,可能就要完蛋了,因为平时调试的
[单片机]
s3c2440 ads程序移植到keil中(二) 初步完成
如果我把参数配置发生改变呢 然后再一次编译 要包错误 如下所示 错误如下 这个错误解决不了 最后查看了网上网友的方法 又可以修改 但是引入了nand文件 最后反正知道了2440init.s文件要修改许多 所以我就不再这里继续整了 浪费时间 直接运用网上网友的东西即可 网友编写的地址 https://blog.csdn.net/hannibaychty/article/details/44873327 从买板子到现在,想想也有2个月啦,开始就想跑裸奔的,可是工程都是在ADS下,win7系统根本不能用,于是就想着怎么在MDK跑,可是MDK上s3c2440的启动文件是不完整的,因此不推荐使用,为此蛋疼聊好长一段时间,查了很
[单片机]
在Keil C51中直接使用二进制数的解决方法
在Keil C51中数不能直接以 二进制 形式赋值,虽然在8051的汇编中是可以的。二进制数虽然书写长,易出错,但是由于是一位位写的,所以程序设计者能够很明确的看到每一位的状态,看得比较直观。于是很多人怀念了8051的汇编,很想在C51中使用二进制。没猜错的话搜到本篇日志的人很可能就是来找这种解决办法的,下面两种办法都是不错的选择。 方法一: 建立一个头文件,将所有的二进制数宏定义列举出来,用的时候直接使用宏定义,头文件定义:binary(右键 “目标另存为” 下载)。 方法二: 做一个带参数宏定义,将输入的类二进制数变换为对应的16进制数,整个定义和使用实例请见下文,可以直接使用,如果想研究原
[单片机]
Keil 字节对齐
一.什么是字节对齐,为什么要对齐 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上
[单片机]
在KEIL下搭建基于 STM32 和 rt-thread 的开发环境
RT_thread开发人员是用MDK(Keil)进行开发管理的,当然也提供了IAR等开发环境的配置。针对初学者都提供了相关的教程和案例,不过项目开发,还是得讲究一下如何有效搭建开发环境和配置。 MDK(Keil)的安装和配置(破解)就略过了。能进行开发移植系统的程序员如果还不会最基础的开发环境搭建,那……去闭关修炼吧。 芯片选择:ST(意法半导体)-STM32F103ZE 原因: 开发必备。大多单片机爱好者,学习过程基本是:菜鸟52- 逐步深入stm32- 深度中毒ARM。 ST芯片应用广泛。ST的性价比(点赞)和高性能在各领域都发挥着重要作用(好用吖)。 ST开发容易。固件库和资料都很全,网上大把教程和学习板(
[单片机]
9G-N79E8X 新唐N79E8X+Keil C51入门开发过程简介
一,准备Keil C51 + 新唐N79E8X软件包 1,在http://www.mcu123.com/news/Soft/embsof/uc/201109/539.html 上点击 ::下载地址:: 下的 FTP下载地址1 ,在弹出的网页上 http://www.mcu123.com/news/Soft/ShowSoftDown.asp?UrlID=1&SoftID=539 上再右击 下载地址: 后的 下载 选择 目标另存为 下载文件到本地硬盘。 下载keil c51v9.05 KEIL V9 C51V905 文件名是:c51v905_mcu123.rar ftp://mcu123.com/%D2%D1%D5%FB%
[单片机]