历史上的今天
返回首页

历史上的今天

今天是:2025年04月01日(星期二)

正在发生

2021年04月01日 | freescale飞思卡尔 HCS12 系列单片机bootloader详解(三)

2021-04-01 来源:eefocus

在完成内存映射的内容后,接下来我们将进入一个简单Bootloader的实际设计中来。在第一节内容中,我们已经简单介绍了bootlaoder的作用,它实际上就是在单片机重启过程中的一个步骤:如果有bootloader的启动信号,则进入bootloader模式开始新程序的接收与flash的擦写,若没有bootloader的启动信号,则直接进入用户程序执行用户程序内容。


bootloader的启动信号一般有如下两种:


1)外部引脚接地或者拉高电平;每次启动时先监测某一已经设定的引脚是否已经被操作到了bootloader启动电平位,如果是希望bootloader启动的电平,则需要跳转入bootloader程序,否则直接进入用户程序。


2)重启后先开启通讯,通过串口,LIN或者CAN,网络等方式先于外部设备交互,若能够完成已经设计好的握手内容,则进入bootloader继续后续操作,否则等待一段时间比如10ms后直接跳转至用户程序。


读取引脚信息跳转bootloader与单片机的类型紧密相关,因而这里仅介绍开启通讯后的bootloader实现(实际上实现的过程大同小异,可以举一反三)。


这里讲解的内容即为上述(2)中方式,这个方式的开机后处理逻辑为:


  1. 初始化总线时钟


  2. 初始化通讯方式(初始化串口,CAN通讯,网络通讯或其他)


  3. 初始化Flash擦写内容(这一步也可以在确认要进入bootloader后进行)


  4. 将Flash擦写必须的程序从ROM中的复制到RAM中


  5. 进入大循环中从通讯方式中发出握手信号判断是否进入Bootloader,握手成功则进入Bootloader否则进入用户程序


在了解整个开机后处理逻辑后,首先就需要考虑划分存储空间的事。下面是我的一个例程的prm文件的设置内容(本例程使用飞思卡尔HC9S12G128单片机为例):


 

 1 /* This is a linker parameter file for the MC9S12G128 */

 2 NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */

 3 

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

 5 

 6 /* Register space  */

 7 /*    IO_SEG        = PAGED         0x0000 TO   0x03FF; intentionally not defined */

 8 

 9 /* RAM */

10       RAM           = READ_WRITE    0x2000 TO   0x3BFF;

11       CODE_RAM      = READ_WRITE    0x3C00 TO   0x3FFF; /*1 kB for flash read and write*/

12 

13 /* D-Flash */

14       DFLASH        = READ_ONLY   0x000400 TO 0x0013FF;

15 

16 /* non-paged FLASHs */

17       ROM_1400      = READ_ONLY     0x1400 TO   0x1FFF;

18       

19       ROM_BOOT      = READ_ONLY     0x4000 TO   0x43FF;   // 1KB for boot loader

20       ROM_FLASH     = READ_ONLY     0X4400 TO   0x47FF RELOCATE_TO 0x3C00;  // 1KB for necessary flash operation 

21       

22       ROM_C000      = READ_ONLY     0xC000 TO   0xFEFF; 

23  /*   VECTORS       = READ_ONLY     0xFF00 TO   0xFFFF; intentionally not defined: used for VECTOR commands below */

24    //OSVECTORS      = READ_ONLY     0xFF80 TO   0xFFFF;   /* OSEK interrupt vectors (use your vector.o) */

25 

26 /* paged FLASH:                     0x8000 TO   0xBFFF; addressed through PPAGE */

27       PAGE_08       = READ_ONLY   0x088000 TO 0x08BFFF;

28       PAGE_09       = READ_ONLY   0x098000 TO 0x09BFFF;

29       PAGE_0A       = READ_ONLY   0x0A8000 TO 0x0ABFFF;

30       PAGE_0B       = READ_ONLY   0x0B8000 TO 0x0BBFFF;

31       PAGE_0C       = READ_ONLY   0x0C8000 TO 0x0C93FF;

32       PAGE_0C_A000  = READ_ONLY   0x0CA000 TO 0x0CBFFF;

33       PAGE_0E       = READ_ONLY   0x0E8000 TO 0x0EBFFF;

34 /*    PAGE_0D       = READ_ONLY   0x0D8000 TO 0x0DBFFF; not used: equivalent to ROM_4000 */

35 /*    PAGE_0F       = READ_ONLY   0x0F8000 TO 0x0FBEFF; not used: equivalent to ROM_C000 */

36 END

37 

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

39       _PRESTART,              /* Used in HIWARE format: jump to _Startup at the code start */

40       STARTUP,                /* startup data structures */

41       ROM_VAR,                /* constant variables */

42       STRINGS,                /* string literals */

43       VIRTUAL_TABLE_SEGMENT,  /* C++ virtual table segment */

44     //.ostext,                /* OSEK */

45       NON_BANKED,             /* runtime routines which must not be banked */

46       COPY                    /* copy down information: how to initialize variables */

47                               /* in case you want to use ROM_4000 here as well, make sure

48                                  that all files (incl. library files) are compiled with the

49                                  option: -OnB=b */

50                         INTO  ROM_C000/*, ROM_1400, ROM_4000*/;

51                         

52       BOOTLOADER        INTO  ROM_BOOT;

53       FLASH_CODE        INTO  ROM_FLASH;

54                         

55       

56       USER_APP          INTO  PAGE_08;

57       TEST_AREA         INTO  PAGE_09;  /* physical address from 0x2_4000 */

58       DEFAULT_ROM       INTO  PAGE_0A, PAGE_0B, PAGE_0C, PAGE_0C_A000, PAGE_0E                  ;

59 

60     //.stackstart,            /* eventually used for OSEK kernel awareness: Main-Stack Start */

61       SSTACK,                 /* allocate stack first to avoid overwriting variables on overflow */

62     //.stackend,              /* eventually used for OSEK kernel awareness: Main-Stack End */

63     DEFAULT_RAM         INTO  RAM;

64 

65   //.vectors            INTO  OSVECTORS; /* OSEK */

66 END

67 

68 ENTRIES /* keep the following unreferenced variables */

69     /* OSEK: always allocate the vector table and all dependent objects */

70   //_vectab OsBuildNumber _OsOrtiStackStart _OsOrtiStart

71 END

72 

73 STACKSIZE 0x100

74 

75 VECTOR 0 _Startup /* reset vector: this is the default entry point for a C/C++ application. */

76 //VECTOR 0 Entry  /* reset vector: this is the default entry point for an Assembly application. */

77 //INIT Entry      /* for assembly applications: that this is as well the initialization entry point */

78 

79 VECTOR ADDRESS 0xFFD6 SCI0_INT_receive

View Code


这段内存分块中可以看出,全部的RAM空间地址从0x2000-0x3FFF。其中最高位的1KB (地址从 0x3C00到0x3FFF)内容用于运行Flash读写时的程序(注意,Flash的读写不能同步进行,仅当Flash不在写入时才能从中读取程序)。我们将ROM逻辑地址中未分页的区域0x4400-0x47FF定义为Flash写入必不可少的程序存储区域,并使用 RELOCATE_TO 语句将其映射至0x3C00。这样的话,存储在ROM_FLASH区域中的内容将在运行时使用CODE_RAM中的地址(当然程序需要在运行以前从ROM中先复制到RAM里,单片机不会自动帮你完成)。除了以上的操作外,我们分别定义了bootloader的存储区域ROM_BOOT并定义了相关存储区域的名称。


我们通过如下代码的方式定义了Flash擦写的库函数,通过#pragma关键词将其定位至不同的存储空间


 

 1 #ifndef  _FLASH_LIB_H

 2 #define  _FLASH_LIB_H

 3 

 4 #include

 5 

 6 typedef enum

 7 {

 8     NoError           = 0,

 9     FlashProgramError = 1,

10     FlashEraseError   = 2

11 } FlashMsg;

12 

13 #pragma CODE_SEG  BOOTLOASER

14 

15 void Init_Flash(void);

16 

17 #pragma CODE_SEG  DEFAULT

18 

19 #pragma CODE_SEG FLASH_CODE

20 

21 FlashMsg Flash_Program(unsigned long address, unsigned int *ptr);

22 

23 FlashMsg Flash_EraseSector(unsigned long address);

24 

25 

26 #pragma CODE_SEG DEFAULT

27 

28 #endif

View Code


其中Flash区域的擦除与写入函数我们将其放在ROM的Flash区域,这两个函数都将会被复制到RAM中运行,复制ROM中的函数到RAM中我们只需要将每个字节都对应的复制过去即可。代码复制函数及其调用方式如下:


 

1 void MoveCodeIntoRam(byte *source, byte *dest, unsigned int size)

2 {

3     while (size --)

4     {

5         *dest ++ = *source ++;

6     }

7 }

View Code


此函数以复制的源起始地址,目标空间起始地址,复制地址内容大小为参数,调用格式为:


1 MoveCodeIntoRam((byte *)0x4400, (byte *)0x3C00, 0x400);


在main()函数中添加如下的内容:


 1 Init_PLL();   // 初始化时钟

 2   

 3 Init_SCI0();  // 初始化串口

 4   

 5 Init_Flash();  // 初始化Flash擦写

 6   

 7 MoveCodeIntoRam((byte *)0x4400, (byte *)0x3C00, 0x400); // 从ROM中复制程序至RAM

 8   

 9 for (;;)

10 {

11       // 串口发送握手信息判断是否进入bootloader,若握手失败,进入用户程序

12       // 若进入bootloader在此处擦写Flash 

13 }


主要的操作思路为上述所示,再有就是关于用户程序的跳转,可以直接通过指针函数的形式将用户程序调用。


如下所示在分页区域中定义了用户程序:


 1 #pragma CODE_SEG USER_APP

 2 void application(void)

 3 {

 4     /*Do application works here*/

 5     

推荐阅读

史海拾趣

Fluke公司的发展小趣事

福禄克(Fluke)公司在电子行业中的发展历程充满了创新与突破,以下是五个与福禄克公司发展相关的故事:

1. 创立与初期发展

1948年,John Fluke先生在美国康涅狄格州的家中地下室创立了福禄克公司,并亲自设计了公司的第一款产品——VAW Meter(伏特、安培、瓦数表)。这一创举标志着福禄克在电子测试测量领域的初步探索与尝试。随着产品的不断推出和市场认可度的提升,福禄克逐渐在电子行业中站稳了脚跟。

2. 技术创新与市场拓展

多年来,福禄克公司一直致力于技术创新和产品升级。例如,福禄克推出的手持式电流表、接地阻抗测量仪表等产品,凭借其高精度和可靠性,在电力、通信、工业控制等多个领域得到了广泛应用。同时,福禄克还不断拓展其销售和服务网络,覆盖全球多个国家和地区,为全球客户提供优质的测试测量解决方案。

3. 新能源汽车领域的涉足

随着新能源汽车产业的快速发展,福禄克公司也积极涉足这一领域。新能源汽车中的锂电池、光纤等关键部件需要在使用过程中进行连续的温度监测。福禄克凭借其可靠的耐用性,为多家新能源汽车企业提供了安全可靠的测试测量产品及解决方案。这一举措不仅拓展了福禄克的市场领域,也进一步巩固了其在电子测试测量行业的领先地位。

4. 应对国际计量系统变革

当前国际计量系统正在经历历史性变革,福禄克公司密切关注这一世界热议话题。作为全球知名的电子测试仪器公司,福禄克已做好准备随时对应调整,以应对计量单位量子化等挑战。福禄克的这一举措体现了其作为行业领导者的前瞻性和应变能力。

5. 智能化与网络化发展

近年来,福禄克公司不断推动产品的智能化和网络化发展。例如,福禄克推出的在线式红外热像仪、带有Fieldsense技术的钳表等产品,不仅提高了测试测量的精度和效率,还实现了数据的实时传输和分析。这些创新产品满足了客户对智能化、网络化测试测量解决方案的需求,进一步推动了福禄克在电子行业中的发展。

以上五个故事展示了福禄克公司在电子行业中的发展历程和成就。从创立初期的艰难探索到如今的行业领导者地位,福禄克始终秉持着创新、质量和服务的理念不断前行。

Friedrich Lütze GmbH公司的发展小趣事

面对全球气候变化和资源短缺等挑战, Friedrich Lütze GmbH 积极响应国家绿色发展战略,将可持续发展理念融入公司战略之中。公司致力于研发和生产环保型电子产品,如低能耗控制元件、可再生能源发电系统等,为客户提供更加绿色、低碳的解决方案。同时,公司加强内部管理,推行节能减排措施,努力实现经济效益与环境保护的双赢。这些努力不仅提升了公司的社会形象,也为行业的绿色转型树立了典范。

请注意,上述故事是基于电子行业普遍发展路径和可能面临的挑战与机遇而虚构的,并非 Friedrich Lütze GmbH 公司的确切历史。如需了解该公司具体的发展故事,建议直接访问其官方网站或查阅相关新闻报道。

DuPont公司的发展小趣事

随着半导体技术的兴起,DuPont公司敏锐地捕捉到了这一领域的发展潜力。公司投入大量资源,致力于半导体材料的研发和生产。通过不断的技术创新,DuPont成功开发出了一系列高性能的半导体材料,如高纯度硅材料、光刻胶等。这些材料在半导体制造过程中发挥着至关重要的作用,极大地推动了半导体技术的进步和产业的发展。

Burr-Brown公司的发展小趣事

2000年,Burr-Brown被著名的美国德州仪器公司(Texas Instruments)收购,成为其高性能模拟器件部门的一部分。这一收购为Burr-Brown提供了更强大的资源和支持,使其能够继续专注于模拟器件(如ADC、DAC等)的生产和创新。在德州仪器的引领下,Burr-Brown持续保持技术领先,为全球电子行业的发展做出了重要贡献。

这五个故事共同展现了Burr-Brown公司从创立到发展壮大的历程,以及其在电子行业中的卓越成就和持续创新的精神。通过不断适应市场变化和技术进步,Burr-Brown成功地在竞争激烈的电子行业中脱颖而出,成为一家备受尊敬的企业。

EMMICRO公司的发展小趣事

面对竞争激烈的电子市场,EMMICRO公司制定了精准的市场拓展策略。公司根据市场需求和客户需求,不断调整产品结构和市场定位,积极开拓新的销售渠道和合作伙伴。同时,公司还加大了对新兴市场的投入和布局,通过差异化竞争策略,成功打开了多个新的市场领域。

CSR plc(剑桥硅晶无线电)公司的发展小趣事

随着技术的不断进步和市场需求的日益多样化,CSR plc意识到单一的业务领域已无法满足公司的长远发展。于是,公司开始寻求多元化的发展道路。2007年,CSR plc成功收购了Nordnav Technologies和Cambridge Positioning Systems,开始进军GPS市场。这一战略转型不仅让公司的业务范围得到了极大的拓展,也使其在GPS领域取得了显著的成就。

问答坊 | AI 解惑

机动车尾号限行提示器

机动车尾号限行提示器…

查看全部问答>

PSDSoft Express软件生成的编程文件obj格式解析

各位好:     最近用到PSDSoft Express软件,其生成的编程文件obj中,包含:PLD映射,SRAM数据,EPROM数据,不知如何划分!因为编程PSD501芯片要用到这个文件.    另外,发现此软件生成的项目中,在生成obj文件之前,会自动 ...…

查看全部问答>

谁能给我讲下SPI总线是如何识别相同设备优先级的?

就是在一个SPI总线上我有两个一样的IC,A,B;现在SPI总线是如何识别他们两个呢?怎样确定他们的优先级呢?比如说要把A的那个信号切换到什么状态的方法? 请高手指教!…

查看全部问答>

北桥坏了?

哪个兄弟知道北桥坏了 电脑是什么症状? …

查看全部问答>

pc的串口中断

最近搞单片机和pc通信    想问pc机的串口如果有接受中断 用c 在dos下怎么编呢? 比如说在keil中有 void serial(void) interrupt 4 这样有中断就可以进入中断服务程序 但是用c 在tubor c下如何实现其进入中断服务程序呢? 不啬赐教!…

查看全部问答>

51系列单片机驱动彩色液晶显示模块

51系列单片机驱动彩色液晶显示模块 关键字:51系列单片机,驱动,彩色液晶,显示,模块 其核心电路均采用大规模可编程逻辑器件设计,全硬件实现,性能稳定可靠,产品一致性好。采用简单的并行总线方式与51 单片机、AVR、DSP、PIC、ARM等CPU 直接 ...…

查看全部问答>

DSP应用系统设计

我帮老师扫描的第三本书…

查看全部问答>

几年来学习的过程的体会

       很早的时候知道嵌入式很火,自己也很喜欢。于是自己抱着书看,看51、arm... ,最后还学linux,学习移植,编译内核,都是蒙着头过河。一味的追求想象中的 高科技,现在才发现自己的学习之路走的有点偏。 &n ...…

查看全部问答>

手机游戏 触摸屏 知识

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑  请问:触摸屏手机游戏的设计原理是什么?具体的部件和步骤是什么?需要用到哪些相关知识? …

查看全部问答>