历史上的今天
返回首页

历史上的今天

今天是:2025年07月15日(星期二)

正在发生

2021年07月15日 | MC9S12XEP 的bootloader解析

2021-07-15 来源:eefocus

MC9S12XEP 的bootloader 归纳总结 两个要点:


1.ROM不要重叠,bootloader的代码与用户应用代码不要重叠。各自设置各自的ROM区域;


2.bootloader有一部分代码是在RAM里运行的,所以RAM也不能重叠,RAM可以分为如下三种:


       a.) 堆栈区域;


       b.)bootloader代码变量区域;


       c.)bootloader 中断地址;


      上述三种RAM类型,不可重叠。


先说bootloader部分,需要处理的步骤如下:


a). 为 bootloader 划出ROM,(.prm文件修改)


b). 为bootloader ROM里再划出一块区域,程序运行时,这个区域里的CODE会被复制到RAM里执行;(.prm文件修改)


c).中断向量映射。地址保存在RAM里,所以,这个RAM与上面存放代码的RAM以及程序运行时的RAM都不要重叠;(.c文件,程序里定义)


d).需要在RAM运行的代码,拷贝到RAM里; (.c文件,程序里操作)


下面是一个project.prm 文件,(这里的地址值用的是 逻辑地址)


INIT _BootStart

 

NAMES END 

 

SEGMENTS  /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */

            

      /* 

      Area 0x3800-0x38FF is reserved for stack. Stack pointer is initialized in StartS12X.s file

      to initail value 0x3900.

      Area 0x3900-0x3CFF is used for standard purposes.      

      Area 0x3D00-0x3EFF is used for functions that must be executed from RAM memory. These functions

      are stored in flash memory in RAM_CODE_SEG (see below) and are copied to RAM memory after startup. 

      Area 0x3F00-0x3FFF is used for interrupt vector table.

      */            

      

      RAM           = READ_WRITE    0x3000 TO   0x36FF;      

      RAM_CODE_SEG  = READ_ONLY     0xFA00 TO   0xFEFF RELOCATE_TO 0x3700;      

      ROM_F000      = READ_ONLY     0xE000 TO   0xF9FF;

 

END

 

PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */

 

      ROM_VAR,  

      STRINGS,  

      DEFAULT_ROM,

      NON_BANKED      INTO  ROM_F000;

 

      DEFAULT_RAM     INTO  RAM;

 

      RAM_CODE        INTO  RAM_CODE_SEG;

END

 

ENTRIES

  flash_array

END

 

STACKSIZE 0x100

 

//handle all reset vectors 

VECTOR 0 _BootStart

VECTOR 1 _BootStart

VECTOR 2 _BootStart

 

 


文件里有这样的字样


      RAM           = READ_WRITE    0x3000 TO   0x36FF;      

      RAM_CODE_SEG  = READ_ONLY     0xFA00 TO   0xFEFF RELOCATE_TO 0x3700;      

      ROM_F000      = READ_ONLY     0xE000 TO   0xF9FF; 


 RAM = READ_WRITE 0X3000 TO 0X36FF    表示代码运行时,可以自由支配使用的RAM区域; 


 其中,0X3000 需要与 .S文件里的 堆栈 设置 相匹配。在.S文件里,如下


 


;********************************************************************************

;* Freescale Semiconductor Inc.

;* (c) Copyright 2004-2005 Freescale Semiconductor, Inc.

;* ALL RIGHTS RESERVED.

;********************************************************************************

;Services performed by FREESCALE in this matter are performed AS IS and without 

;any warranty. CUSTOMER retains the final decision relative to the total design 

;and functionality of the end product. FREESCALE neither guarantees nor will be 

;held liable by CUSTOMER for the success of this project.

;FREESCALE DISCLAIMS ALL WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY INCLUDING, 

;BUT NOT LIMITED TO, IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR 

;A PARTICULAR PURPOSE ON ANY HARDWARE, SOFTWARE OR ADVISE SUPPLIED TO THE PROJECT

;BY FREESCALE, AND OR NAY PRODUCT RESULTING FROM FREESCALE SERVICES. IN NO EVENT

;SHALL FREESCALE BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF 

;THIS AGREEMENT.

;

;CUSTOMER agrees to hold FREESCALE harmless against any and all claims demands or 

;actions by anyone on account of any damage, or injury, whether commercial, 

;contractual, or tortuous, rising directly or indirectly as a result of an advise

;or assistance supplied CUSTOMER in connection with product, services or goods 

;supplied under this Agreement.

;********************************************************************************

;* File      StartS12X.s

;* Owner     b01802

;* Version   1.0   

;* Date      Dec-02-2010

;* Classification   General Business Information

;* Brief     Startup file

;********************************************************************************

;* Detailed Description:

;*

;*    Tested on: DEMO9S12XSFAME, EVB9S12XEP100

;*    

;*    The bootloder handles all reset vectors. This startup file makes a decision

;*    whether the bootloader or user application is executed. 

;********************************************************************************

;Revision History:

;Version   Date          Author    Description of Changes

;1.0       Dec-02-2010  b01802    Initial version

;********************************************************************************

;

  xref  main

;

  xdef  _BootStart

;

AppResetVect:   equ     $effe ; here is stored reset vector of user application

StackTop:       equ     $3000 

_BootStart:

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

  movb  #$01, $025C ; enable pull up resistor on PP0 (or we can use external one)

  

  nop   ;wait a few cycles for stabilization of the signal

  nop

  nop

  nop

  nop

  

  brclr $0259, $01, GoBoot  ; if PP0 == 0 then start the bootloader

                            ; if PP0 == 1 then start the application

  

  movb  #$00, $025C ; disable pull up resistor on pin PP0 - restore default state

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

  

  ldd   AppResetVect

  cpd   #$ffff

  beq   GoBoot          ; if the application reset vector is not available

                        ; then start the bootloader

  ldx   AppResetVect

  jmp    0,x              ; jump to the application

   

  

GoBoot:

  lds  #StackTop

  jmp  main

  

;********************************************************************************


.S文件里的  “ StackTop:       equ     $3000 ” 表示堆栈值是 0X3000 与上述的.prm文件里的  RAM = READ_WRITE 0X3000 TO 0X36FF 相对应,因为.prm文件里定义了堆栈层数是是0X100("STACKSIZE 0x100"),所以 堆栈的地址区域是 0X2F00 ~ 0X3000 ,显然这个区域是专用的.

推荐阅读

史海拾趣

Akustica(Bosch)公司的发展小趣事

Akustica 公司是一家微机电系统(MEMS)技术公司,于2001年成立于美国匹兹堡,后来成为博世集团(Bosch)的子公司。以下是关于 Akustica 公司发展的五个相关故事:

  1. 公司成立和早期发展: Akustica 公司成立于2001年,由匹兹堡卡内基梅隆大学的研究团队创建。该公司专注于 MEMS 技术的研发和创新,致力于开发高性能的声学传感器和系统解决方案。在成立初期,Akustica 聚焦于市场需求日益增长的消费电子和汽车应用领域,并不断推出创新产品,赢得了市场认可。

  2. 博世收购: 随着市场竞争的加剧和技术进步的不断推动,Akustica 公司于2009年被博世集团收购。作为全球领先的技术和服务供应商,博世集团的收购加速了 Akustica 的发展步伐,并为其提供了更广阔的市场和资源,以加速产品创新和业务扩展。

  3. 技术创新和产品发展: 在博世集团的支持下,Akustica 公司不断进行技术创新和产品开发,推出了一系列声学传感器产品,包括麦克风、扬声器和超声波传感器等。这些产品在消费电子、汽车、工业和医疗等领域得到了广泛应用,为用户提供了更优质的声音和声学体验。

  4. 市场拓展和全球业务: 随着技术和产品的不断进步,Akustica 公司逐渐拓展了全球业务,并与各行各业的客户建立了合作关系。公司在美国、欧洲和亚洲等地建立了销售和服务网络,以更好地满足客户的需求,并开拓新的市场机会。

  5. 持续发展和未来展望: Akustica 公司作为博世集团的一部分,继续致力于声学传感器技术和产品的创新,不断提升产品性能和功能,以满足不断变化的市场需求。未来,公司将继续加强在智能手机、智能家居、车载系统、工业自动化和医疗设备等领域的业务拓展,助力客户实现更加智能、便捷和安全的生活和工作环境。

Dresden Elektronik公司的发展小趣事

在技术和产品的双重驱动下,Dresden Elektronik公司开始积极拓展市场。他们不仅在国内市场上取得了显著的成绩,还积极开拓国际市场。通过参加国际展会、与跨国企业合作等方式,公司的知名度和影响力逐渐提升,市场份额也不断扩大。

Agere System(LSI Logic)公司的发展小趣事

在技术和产品的双重驱动下,Dresden Elektronik公司开始积极拓展市场。他们不仅在国内市场上取得了显著的成绩,还积极开拓国际市场。通过参加国际展会、与跨国企业合作等方式,公司的知名度和影响力逐渐提升,市场份额也不断扩大。

Euroquartz公司的发展小趣事

Euroquartz自创立之初,就将产品质量和客户满意度置于公司运营的核心。为了确保这一点,公司引入了完整的AS9100 Rev D质量体系,并通过了相应的认证。这一体系要求Euroquartz在制造程序和可追溯性方面保持完整的记录,审批机关会定期进行审核,确保品质始终如一。这种对品质的执着追求,为Euroquartz赢得了客户的信赖,也为公司的发展奠定了坚实的基础。

ECLIPSE公司的发展小趣事

随着云计算、大数据和人工智能等技术的不断发展,Eclipse也面临着新的挑战和机遇。Eclipse团队正在积极研究新技术,探索新的应用场景。未来,Eclipse将继续保持开放和创新的精神,为开发者们提供更加优秀、高效的开发工具和服务。同时,Eclipse也将继续加强与其他开源项目和公司的合作,共同推动开源生态的发展。

Galil Motion Control Inc公司的发展小趣事

随着Eclipse项目的不断发展,越来越多的知名公司加入到这一开源社区中,如Oracle、Red Hat等。这些公司不仅为Eclipse贡献了代码,还提供了资金支持。Eclipse的功能日益完善,逐渐成为了Java开发领域的佼佼者。同时,Eclipse也支持其他编程语言,如C/C++、Python等,进一步扩大了其用户群体。

问答坊 | AI 解惑

国半推出两款电源管理芯片

美国国家半导体公司(National Semiconductor Corporation) (美国纽约证券交易所上市代号:NSM) 推出两款属于可以数字设定的多输出电源管理芯片系列的新产品, 其中一款是高度灵活的电源管理单元,而另一款则是高度集成的直流/直流转换器。 型号为LP ...…

查看全部问答>

连接器的三大基本性能

连接器的基本性能可分为三大类:即机械性能、电气性能和环境性能。 1.机械性能就连接功能而言,插拔力是重要地机械性能。插拔力分为插入力和拔出力(拔出力亦称分离力),两者的要求是不同的。在有关标准中有最大插入力和最小分离力规定,这 ...…

查看全部问答>

求简易数控电源

输出电流:500或者1A 纹波电压:…

查看全部问答>

请问,我可以在一个线程里注册子窗口类并创建子窗口吗

我在一个线程的事件被激活后,初始化了一个窗口类,并调用CreateWindow(),但窗口并没有显示出来。请问我这样做对吗,原因在哪里呢,还有子窗口的窗口句柄是不是也对应着它的消息处理函数的HWND参数?谢谢高手!…

查看全部问答>

请教对P33的初始化erase

请问在PXA270的BSP中对FLASH--P33(64M)的Erase操作有这样一段代码: if ( ((flashType == L18) || (flashType == L30) || (flashType == P33))&& (num_l3_blocks_erased > 0) ) {     // We need to take care of the first 16K blocks ...…

查看全部问答>

设置位的问题,请指教!!

#define SET_MASK(m,n)  ((m)[(n)>>3] |= (1…

查看全部问答>

电子围栏发展的瓶颈及应对举措

今后发展的瓶颈及应对举措:     (1)技术、产品、行业发展取得用户、社会认同需要一定的时间周期(包括政府重视、形势需要、客户需求、政策支持、行业宣传等)     (2)电子围栏是一种总称,根据不同的工作原理,可以分 ...…

查看全部问答>

UART 中断

怎样实现用UART中断发送数据,以前都是在主程序里给 UCA1TXBUF赋值发送,没问题,可用中断却不行了,请高手指教 TI给的例程没有发送中断的 #include \"msp430x54x.h\"int n;void Delay(){_NOP();}void main(void){ WDTCTL = WDTPW + WDTHOLD;&nbs ...…

查看全部问答>

增强的封装比较和更新

能够比较并合并PCB和其走线设计对象,无论是一个或是多个,并保持设计中的走线和协作。详情请见pdf文件。…

查看全部问答>

ADS7841程序+原理图

终于会玩了这个了,废了三个贴、、、、、、、哎,这次终于完成了!!!…

查看全部问答>