S12(X)微控制器的Bootloader程序

发布者:幸福满溢最新更新时间:2021-08-16 来源: eefocus关键字:微控制器  Bootloader程序 手机看文章 扫描二维码
随时随地手机看文章

实测在MC9S12XEP100上可以使用,但是对我来说需要修改了一个小地方:
可能是由于这个程序的版本太老,PARTID没有考虑到我手头上这个XEP100的PARTID(0xCC95),这个PARTID甚至在芯片手册中都没有提到,不过问题也不大,测试后发现只要和0xCC94一样的处理方法即可了。想知道自己设备的PARTID是多少可以直接去看地址在1A-1B的这两个字节的值是多少。


修改方式为:
首先在PARTID.h中添加一个宏

……

//S12XE:

#define MASK_0M48H 0xCC90       //1024k flash

#define MASK_1M48H 0xCC91

#define MASK_2M48H 0xCC92

#define MASK_3M48H 0xCC93

#define MASK_4M48H_5M48H 0xCC94

#define MASK_5M48H 0xCC95      // 添加的

……


然后在main.c 中的EraseFlash和ProgramFlash两个函数中的switch语句中分别添加一行case。

……

          //S12XE 1024k flash

          case MASK_0M48H:  //Falling to next case

          case MASK_1M48H:  //Falling to next case

          case MASK_2M48H:  //Falling to next case

          case MASK_3M48H:  //Falling to next case

          case MASK_4M48H_5M48H:

          case MASK_5M48H:  // 添加的

                if (!((ProgSRec.LoadAddr >= 0x700000UL) && (ProgSRec.LoadAddr <= 0x7FEFDFUL)))

                  return(SRecRangeError);

                break;

……


然后就能按照指南正常运行了。


180nm微控制器 S12(X)的串行Bootloader

by: Lukas Zadrapa and Ladislav Makovic
Technical Information Center
Roznov
Czech Republic

译者注:译者博客(http://blog.csdn.net/lin_strong),转载请保留这条。此为官方文档AN4258,仅供学习交流使用,请勿用于商业用途。


介绍

这篇应用笔记介绍了为 基于180nm技术的 S12和S12X微控制器家族 编写的一个bootloader程序的运行和使用。


使用这bootloader可以很方便地实现生产中编程或者“在线系统(in-system)”编程,特别是应用于那些 无法使用HCS12背景调试接口(BDM)的场合。用户必须在生产准备阶段或在编程供应商那把bootloader预先烧写进S12(X)。Bootloader会留存在MCU中以供未来使用。


这个bootloader实现支持通过SCI串口将用户软件下载进MCU flash内存中。


这篇文档中描述的bootloader只是一个示例,由其产生的任何后果我们概不负责,并且我们不提供技术支持。


硬件兼容性

有两个版本的bootloader:

  • 第一个是为S12系列(S12P、S12HY、S12HA和S12G)写的。

  • 第二个是为S12X系列(S12XS、S12XE和S12XF)写的。

除非特别标注,这篇应用笔记中的内容适用于所有两个版本。

这个bootloader没有为最小的设备进行优化。因此,不支持MC9S12GN16。

当前不支持对D-Flash或说EEPROM的编程。


需求

为了成功运行这个bootloader,需要满足一些需求。


输入引脚

有许多种方式确定是要启动bootloader还是用户应用程序。比如可以选择通过判断输入引脚的状态、通过EEPROM内存中的某个变量的状态或者通过从通讯接口收到的命令。


这个bootloader使用第一种方式。在重置之后,bootloader会使能PP0引脚的上拉寄存器并且读取PP0引脚的状态以确定是否你想要运行bootloader。


可能这个引脚的外部电路是这样的:一个开关、跳线或者一个按钮与可选的上拉电阻器。

引脚连接
图 1.引脚连接


串行接口

所有的S12(X)微控制器都有集成串行通信接口。注意,需要RS232电平转换器以与PC通信。


默认的,串行通信会设为这个格式:

  • 8数据位

  • 1起始位

  • 1停止位

  • 0校验位

  • Xon/Xoff 流控制

默认的波特率是9600。可以在bootloader的菜单中修改其为38400、57600或115200 bps。


终端模拟程序

可以使用串口调试助手来与PC通信。这个串口调试器必须支持串行COM口通信、Xon/Xoff流控制以及必须支持发送文本文件。


振荡器

S12微控制器不需要外部晶振。bootloader会使用S12微控制器内部的一个1MHz的RC震荡电路。Bootloader设置总线频率为25MHz以支持高速率通信。


S12X微控制器需要晶振或者外部振荡器。在bootloader内配置PLL以达到40MHz的总线时钟频率。这是为了提高通信速率以加快代码下载速度。


功能描述

bootloader的运作方式很直白。这个部分仅描述了最重要的和最特殊的那些。


运作

bootloader会处理所有的重置向量。在重置后,会调用bootloader的startup例程。首先,bootloader会读取PP0引脚的状态。如果引脚值为逻辑0,bootloader就会开始工作。如果是逻辑1,就会调用用户应用程序的startup例程。如果用户应用的重置向量不可用(地址0xEFFE-0xEFFF上的字被擦除),那不管怎么样bootloader都会开始运行。用户可以重写这个代码以更改启动条件。


中断向量

在用户应用用到了中断的情况下,需要使用IVBR寄存器重定位中断向量表。bootloader被放在最高的一个地址块中,地址0xF000-0xFFFF。这个区域是受保护的,所以用户的应用程序不能把中断向量表放在默认的地址0xFF10-0xFFFF。这种方案的优点是bootloader不会受到电源故障的影响,这可能会在重写中断和重置向量时发生。


掩码组与part ID

每个硅掩码组都有一个特定的part ID,位于两个8位寄存器中,PARTIDH和PARTIDL中,地址在0x001A和0x001B。


当要把s-record编程到flash内存中去时,bootloader会检查是否地址位于物理flash内存上。当地址无效时,会返回一个错误。


在bootloader工程的PartID.h文件中可以找到当前支持的掩码组和part ID。


用户指南

这个部分描述了使用这个bootloader的每一步。


配置S12的bootloader

  1. 在CodeWarrior for S12(X)集成开发环境中打开Bootloader_S12工程。bootloader在v5.0和v5.1中测试过了。

  2. 如图2选择target。
    S12 target选项
    图 2.S12 target选项

  3. 通过引脚PP0来决定是启动bootloader还是用户应用程序。如果PP0是低电平,就会启动bootloader,如果PP0是高电平,就会启动用户应用程序。如果这个默认配置不好用,用户可以在Start12.s中重写这个代码。


配置S12X的bootloader

  1. 在CodeWarrior for S12(X)集成开发环境中打开Bootloader_S12X工程。bootloader在v5.0和v5.1中测试过了。

  2. 打开文件Config.h并进行如下设置:
    设置FLASH_PRESCALER(加载到FCLKDIV寄存器中的值)以让flash运行频率在800-1050kHz间,如参考手册所述。
    设置PLL以使总线频率达到40MHz。可以利用这个应用笔记附带的PLL计算器。

  3. 如图3选择target。
    S12X target选项
    图 3.S12X target选项

  4. 通过引脚PP0来决定是启动bootloader还是用户应用程序。如果PP0是低电平,就会启动bootloader,如果PP0是高电平,就会启动用户应用程序。如果这个默认配置不好用,用户可以在StartS12X.s中重写这个代码。


Bootloader指南

  1. 编译工程并通过BDM设备下载bootloader到MCU中去。

  2. 打开串口调试助手。设置波特率为9600,1个起始位,8数据位,1数据位,流控制Xon/Xoff。

  3. 用串行连接线连接PC和开发板。

  4. 让PP0为低电平,然后重启MCU。

  5. bootloader就启动了,然后你会在串口调试助手中看到如下信息。见图4。
    最初的界面
    图 4.最初的界面

  6. 输入“a”以擦除flash内存。第一次不需要这一步,因为flash已经被BDM设备擦除了。

  7. 输入“b”以编程flash。

  8. 现在将用到的S-record作为文本文件发送—见图5。浏览被下载到MCU中的S-record。
    为了测试目的,使用附加到这个应用笔记上的示例S-records。S-records必须使用特定的格式。请参考章节6,“怎么写用户应用程序”以及章节7,“怎么转换将被bootloader下载的S-Record”。
    发送文本文件
    图 5.发送文本文件

  9. 确定对话框和S-record已经被下载到MCU中去了。一个星号(*)代表编程成功了一行。见图6。
    下载用户应用
    图 6.下载用户应用


怎么写用户应用程序

你必须确保用户应用程序不会碰到bootloader的地址范围(0xF000-0xFFFF)。
1. 在CodeWarrior for S12(X)集成开发环境中创建一个新工程。
2. 打开.prm文件
3. 把segment ROM_C000从原来的0xC000-0xFEFF改成0xC000-0xEFDF。这是因为地址0xF000-0xFFFF会放着bootloader,而0xEFE0-0xEFFF会用作用户应用的重置向量。

如果使用了中断:
4. 把segment ROM_4000从原来的0x4000-0x7FFF改成0x4000-0x7F0F。0x7F10-0x7FFF会被用于重定位中断向量表。
5. 如附件示例应用那样创建一个中断向量表,并对应的设置IVBR寄存器。IVBR设置中断向量表的基地址,这种情况下必须被设置为0x7F。


怎么转换将被bootloader下载的S-Record

bootloader接受使用全局(线性)地址的s-records。所有的records必须被对齐为32字节,长度也必须是32字节。
1. 打开SRecCvt工具(SRecCvt-GUI.exe)
2. 选择使用的MC9S12设备(取决你用的是哪个),选择Memory为Flash,选择Operation为Convert File。
3. 选择输入文件格式为Banked,输出文件格式为Linear。
4. 设置S-Record Size为32.
5. 浏览输入文件(由CodeWarrior生成的S19文件)并选择输出文件。
6. 点击Convert按钮。
SRecCvt
图 7.SRecCvt


怎么合并用户应用和bootloader

用户应用可以被独立地开发,或说,不带有bootloader。用户应用可以被加载进微控制器并可以由BDM设备来直接的调试。然而,出于生产目的,将用户应用与bootloader合并到一起是很有价值的,这样就可以在单个s-record文件中把所有东西都下载进微控制器了。

这是推荐的流程:
1. 打开按照第6章“怎么写用户应用程序”中所述那样创建的用户应用程序。
2. 把一个用户应用程序重置向量放到地址0xEFFE,这样bootloader就可以使用这个向量了。拷贝以下三行到main.c中:

  • extern void near _Startup(void)

  • typedef void (*near tFunc)(void)

  • const tFunc rst_vec @0xEFFE = _Startup


  • 3. 移除原先的用户应用程序重置向量。
    在Project.prm文件中注释掉这行:
    //VECTOR 0 _Startup
    4. 复制准备好了的bootloader .s19文件到 ..user_application_projectbin下。比如,s-record文件可以被重命名为bootloader.s19
    5. 链接这个文件到用户应用程序中。
    在Project.prm的开头加上这个命令:
    HEXFILE bootloader.s19
    6. 添加如下命令到文件..user_application_projectcmdP&E_Multilink_CyclonePro_Preload.cmd中:

    FLASH NOUNSECURE

    这个命令能确保烧写器不会在MCU编程过程中自动地改变0xFF0F处的flash安全字节为一个不安全状态(0xFE),这样,这个phrase(0xFF08-0XFF0F)就可以被加载定义在bootloader中的值了。如果不使用这个命令,会导致在这个phrase发生ECC错误,芯片会被保护,并且flash会被完全保护。
    7. 编译项目。最终的s-record就准备好被BDM设备下载入微控制器了。



  • 测试

    这个bootloaders在这些开发板上测试成功过:


  • Zip文件的内容

    所有提到的工程和工具都在这篇应用笔记相关的zip文件中。

    • Bootloader_S12 — S12微控制器的bootloader工程。

    • Bootloader_S12X — S12X微控制器的bootloader工程。

    • Demo_applications — 示例怎么写用户应用程序的工程。

    • Coverted_srecords — 源于Demo_applications的已经被SRecCvt工具转换好的S-Records。这些S-Records可以由bootloader下载进MCU中。

    • Demo_applications_with_linked_bootloader — 包含bootloader的用户应用程序。

    • SRecCvt — 用于转换S-Record的工具。

    • S12XE_PLL_Calculator — 帮助设置PLL模块的工具。

    • DEMO9S12PFAME

    • DEMO9S12HY64

    • TWR-S12G128

    • DEMO9S12XSFAME

    • EVB9S12XEP100


关键字:微控制器  Bootloader程序 引用地址:S12(X)微控制器的Bootloader程序

上一篇:对MC9S12XS128MAL中TIM、PIT、RTI的一点理解
下一篇:通过MC9S128上的502AT热敏电阻进行温度的检测与加热

推荐阅读最新更新时间:2024-11-13 11:05

介绍单片机上的几种按键输入实现方法
按键作为一种简单实用的输入设备已经应用于各种单片机应用系统中,称得上是无处不在。 但是在不同的实用场合下所使用的按键也是各不相同。现在就对几种经常用到的按键及其使用方法进行介绍。 一、传统按键: 传统按键是现在在各种电子设备中应用最为广泛的按键,可能它们的形状各有不 同,但其控制方法却大同小异,利用按键是否按下的IO 电平状态变化来对其进行识别。 1)直接按键 最简单的键盘就是把电平信号直接接到IO 上。在程序里面读取IO 电平状态,如 果读到相应的电平,则说明此IO 上所接的按键被按下。这种方法原理与控制方法都非 常简单,但造成了IO 资源的浪费。这种按键方式的示意图如下: 2)扫描按键矩阵 这种按键输入方式很巧妙地利
[单片机]
#单片机#矩阵键盘-电子琴
#include reg52.h //包含51单片机寄存器定义的头文件 sbit sound=P0^4; //将sound位定义为P0.4 #define uchar unsigned char #define uint unsigned int uchar k,num,temp; uint code yinfu = {64580,64684,64777,64820,64898,64968,65030 }; //中1,中2,中3,中4,中5,中6,中7 void delay(uint z) { uint x,y; for(x=z;x 0;x--) for(y=1
[单片机]
单片机自学笔记之:流水灯设计程序
#include reg52.h //52系列 单片机 头文件 #include intrins.h //C51库自带头文件 #define uchar unsigned char //宏定义无符号字符型为uchar #define uint unsigned int //宏定义无符号整型为uint void delay(uint z); //声明延时函数 uchar aa; //定义无符号变量 void main() //主函数 { aa=0xfe; //给变量赋初值 while(1) //大循环,无限循环 { P1=aa; //给P1口赋值1010 1010 delay(500); //调用延时子函数延
[单片机]
嵌入式学习笔记16——AVR单片机之优势
1. 速度快,性价比高,片上资源丰富,IO口驱动能力强,可选型号种类多,保密性好(程序不易被破译),学习容易开发简单。 2. AVR单片机的种类 (1)ATtiny系列:如tiny13、tiny15、tiny26,功能较简单,属于低档,适合功能相对单一的系统; (2)AT90S系列:AT90S8515等,属中档,适合一般系统开发,现在在慢慢的淘汰,向ATmega系列转型。 (3)ATmega系列:Mega8、Mega16、Mega128等,功能较强,属高档,适合各种具有较高要求的系统。 3. AVR的IO与51单片机的区别 (1)51IO口大部分为准双向口,复位时全部输出高电平,对端口的输入和输出操作也直接通过IO端口的地
[单片机]
51单片机几个精确延时程序
  51单片机几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响.   一. 500ms延时子程序(晶振12MHz,一个机器周期1us.)   程序:   void delay500ms(void)   {   unsigned char i,j,k;   for(i=15;i 0;i--)   for(j=202;j 0;j--)   for(k=81;k 0;k--);   }   计算分析:   程序共有三层循环   一层循环n:R5*2 = 81*2 = 162us DJNZ 2us   二层循环m:R6*(n+3)
[单片机]
基于52单片机与ds1302时钟芯片的电子闹钟C程序
  52单片机是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。   52单片机结合可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等功能的dDS1302时钟芯片做出的电子闹钟会有什么火花呢?奉上基于52单片机与ds1302时钟芯片的电子闹钟C程序,让大家亲身体验。      52单片机与ds1302时钟芯片的电子闹钟C程序   #inc
[单片机]
STC89C52系列单片机内部资源——定时器和计数器
CPU时序的有关知识 振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期) 状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。 机器周期:机器周期也就是CPU完成一个基本操作所需要的时间。1个机器周期含6个状态周期,12个振荡周期。机器周期=1/单片机的时钟频率。 时钟频率:外部时钟的12分频。也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频。比如说你用的是12MHZ的晶振,那么单片机内部的时钟频率就是12/12MHZ,当你使用12MHZ的外部晶振的时候。机器周期=1/1M=1us。 指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。 在学习定时器之前
[单片机]
STC89C52系列<font color='red'>单片机</font>内部资源——定时器和计数器
单片机受电磁干扰怎么解决?
对于新手来说,在单片机的电路设计中可能不会很注意电路设计中电磁干扰对设计本身的输入输出的影响,但是对于一个电子工程师来说其中的厉害关系就不言而喻了,它不仅关系了单片机在控制在中的能力和准确度,还关系到企业在行业中的竞争。 对电磁干扰的设计我们主要从硬件和软件方面进行设计处理,下面就是从单片机的PCB设计到软件处理方面来介绍对电磁兼容性的处理。 一、影响EMC的因数 1.电压 电源电压越高,意味着电压振幅越大,发射就更多,而低电源电压影响敏感度。 2.频率 高频产生更多的发射,周期性信号产生更多的发射。在高频单片机系统中,当器件开关时产生电流尖峰信号;在模拟系统中,当负载电流变化时产生电流尖峰信号。 3.接地 在所有EMC题目中,主
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved