基于飞思卡尔的Bootloader程序下载更新
基于LIN总线ECU远程升级系统的设计与实现

图7 配置文件截图
系统升级时上位机首先读取配置文件中[init]中的内容从而完成上位机的基本配置,主要包括:上位机物理ID,上位机功能ID,下位机ID,下位机功能ID,波特率。
配置结束后上位机根据[stepn](n从1开始依次递增直至
图8 升级系统连接图
产品功能测试使用公司已量产的某款BCM(车身控制器)程序。
每次下载完成后测试程序功能,正常则表示升级成功否则为升级失败。
该测试根据程序大小共分为四组,每组分别进行100次升级,时间取平均值。
关于代码的大小通过适当地对该BCM程序删减一些功能或增加一些无效的代码进行控制。
其升级用时时间与理论用时时间对比如表1:(LIN的传输速率V = 19.2kbit/s,flash擦写
= 167ms,写入1k字节标准用函数擦除16k用时约T
d16
=32ms)[10] 假设需要升级的程序为N K。
则理论时约T
w1
用时时间:
t = 150*(N*1024)/(19.2*8) + (N/16)*T d16 +N*T w1
表1 升级用时时间
程序SIZE实际用时成功概率。
飞思卡尔系列机型固件升级操作方法

飞思卡尔系列机型固件升级操作方法感谢您使用本公司的产品,当您的PAD设备需要升级新的固件时,请按如下的操作指引进行具体操作:固件升级升级包主要包含:u-boot-no-padding.bin, boot.img ,system.img三部分,其中每个文件都有一个对应的md5文件,用于检查升级文件的正确性。
在升级固件时需要将上诉三个文件对应的md5文件一起拷贝到外边TF卡的根目录下面,即下面六个文件:u-boot-no-padding.bin ,u-boot-no-padding.md5;boot.img, boot.md5;system.img , system.md5注:在升级过程中,可以根据实际情况升级其中一部分,也可全部升级。
步骤一:准备一张用于升级的TF卡,有效容量必须大于512M,再从我公司的官方网站上下载相对应的软件到您的电脑中,解压后将要升级的文件和对应的md5文件拷贝到TF卡根目录后,然后将TF卡插入PAD的外部TF卡插座。
步骤二:长按PAD设备“POWER“(电源)键关机(若此时无法正常关机),长按“Vol-”(音量减)键不放,再按“POWER”(电源) 键开机,直到屏幕上出现企鹅画面,才松开“Vol-”(音量减)键,约经过三秒钟左右,会显示机器人界面,如下图:步骤三:单击音量减(Vol-)键,将弹出主操作界面,如下图:界面上显示的含义如下:reboot system now ----------------重新启动。
wipe data/factory reset-----------恢复出厂设置wipe cache partition----------------擦拭缓存分区apply update from sdcard--------------------从SD卡申请更新apply update from ext sd---------------------申请更新来从外部SD卡update u-boot-no-padding.bin------------------更新u-boot文件update boot.img-----------------------------------更新boot.img文件update system. img------------------------------更新system.img文件update all image files------------------------------更新所有的图像文件步骤四:使用“Vol+”/ “Vol-“(音量加/减)键,上下移动光标,选择需要升级的内容(如不确认需要升级的内容,可选择“update all image files--更新所有的图像文件”),按“POWER”(电源键) 确认。
在P2020平台下使用串口更新Bootrom

在P2020平台下使用串口更新Bootrom周加谊;蒲永材;李中【摘要】针对传统情况下更新bootrom需要取下存储芯片编程,频繁操作会对主板底座造成伤害问题,论文提出了一种在P2020平台下启动vxWorks系统后使用串口在线更新bootrom的方法.定义了一套基于串口的通信传输协议,为保障数据在传输过程中完整性和正确性,在传输过程中采取了校验和重传机制.最后文章介绍了flash烧写的具体实现过程.测试结果显示,该方法具有可靠性高和成功率高的特性.【期刊名称】《机电产品开发与创新》【年(卷),期】2017(030)005【总页数】3页(P92-94)【关键词】P2020;串口;在线烧写;vxWorks;bootrom【作者】周加谊;蒲永材;李中【作者单位】中国兵器装备集团自动化研究所武器装备信息与控制研发中心,四川绵阳621000;中国兵器装备集团自动化研究所武器装备信息与控制研发中心,四川绵阳621000;中国兵器装备集团自动化研究所武器装备信息与控制研发中心,四川绵阳621000【正文语种】中文【中图分类】TN914;N随着嵌入式系统的快速发展,其中VxWorks系统凭借其良好的可持续性、高性能的内核等优点越来越受到人们的关注。
由于该系统的强实时性、高稳定性以及内核的可裁剪性已经使其广泛应用于通讯、船舶、航空等实时性要求特别高的领域中[1]。
Bootrom是基于vxWorks[2]定制的一套类似于uboot的bootloader[3],主要功能是初始化硬件和引导vxWorks操作系统。
P2020由飞思卡尔公司研发一款可实现单线程极高性能功耗比的处理器,适用于联网、电信、军事以及工业领域的各种应用[4]。
针对传统更新bootrom存在的这些问题,本文提出了使用串口的方式更新bootrom,该方法在启动vxWorks系统后使用串口在线更新,而不需要拆卸任何硬件装置。
本方案我们采用型号为am29f040的nor flash存放bootrom引导文件,容量为512KB。
飞思卡尔MC9S08及MC9S12 单片机通过SCI口更新程序的一种方法

通过SCI口单片机通过飞思卡尔MC9S08及MC9S12 单片机更新程序的一种方法王佚(Freescale 8/16bit MCU FAE) 飞思卡尔的8/16 Bit 单片机内置FLASH可以通过单片机编程来进行擦除与编程,所以,理论上就可以通过SCI口接口实现软件的自我升级.在实际工作中,我们也遇到不少客户询问相关的实现方法,而我们也给了一些参考代码,但还是有不少工程师不能很好地理解,基于这些原因,我写了点东西来介绍一种比较简单的实现方法,供大家参考,如有不周,敬请批评与谅解.一,飞思卡尔MC9S08单片机内部存储器介绍MC9S08有很多系列单片机,一般程序空间均在64K以下,为了介绍方便,我们以MC9S08AW60一种为例进行介绍.上图为MC9S08AW60的数据空间分布图,对于大于64K空间的MC9S08单片机,其结构与MC9S12单片机类似,故先不做介绍.从图中我们不难看出,由于飞思卡尔单片机的数据存储器(RAM)与程序存储器(FLASH)是统一编址,所以,我们可以将程序引导到RAM里运行.二,飞思卡尔 8位单片机内部中断相量地址介绍飞思卡尔 8位单片机对中断处理是通过判断中断相量表的地址来判断程序的入口地址的.飞思卡尔 8位单片机的中断相量为16位,其放置在从0xFFFF地址向下按照中断号以此排放.三, 飞思卡尔MC9S08单片机FLASH操作简介飞思卡尔MC908及MC9S08系列单片机的FLASH都可以通过软件进行擦除与编程,不同的是MC908有相应的程序内置在单片机的ROM空间,而MC9S08没有,其需要用户自己编写.飞思卡尔的CodeWarrior for MC9(S)08软件在安装后,在\freescale\CodeWarrior for Microcontrollers V6.0\(CodeWarrior_Examples)\HCS08\Device Initialization C Examples\GB60_Modules\Sources\Flash_GB60目录下有响应的参考代码.MC9S08系列单片机的Flash有四种操作模式:Byte program, Byte program (burst), Page erase及Mass erase,其操作时间见下表.需要说明的是,在此操作其间,不可以使能任何中断.下图为操作流程图.需要说明的是,用来实现”Write a data value to an address in the FLASH array”的语句代码,表面上看是将一个数据写到一个Flash数据区去,但实际上是将所需要编程的Flash地址或是擦除的Flash的块地址及数据分别写入到单片机内类似地址积存器及数据寄存器里.CodeWarrior里自带的代码,是用机器码的方式来做的,其也给出了相应的代码,大家可以对应着看看,一般来说,只做Flash模拟EEPROM,该代码即可满足大家使用.在此,本文就不详细描述代码实现的方法.四,实现程序自我更新的两种常见方法及各自特点一般说来,我们有两种方法来,我们有两种常见方法实现程序自我更新.一种是将实现程序更新的部分的程序与应用程序融合在一起,系统在更新程序时甚至可以将整个程序包括更新程序一起更新掉,其优点是可以花费少的程序空间,缺点是数据及主程序空间分配比较麻烦,且在做更新程序时一旦掉电或是其它什么原因,可能无法进行程序的再次更新.另外一种是,将实现程序更新的程序写成是一个独立的程序,其缺点是要浪费部分程序空间,且中断相量无法更新所以要做程序的映射,类似引导(bootload)的概念.其优点是在编写应用程序时不用考虑数据空间地址分配的问题,同时不用担心下载过程出现任何异常情况.本文后面所涉及的内容,均以第二种方法为例,为描述方便,我们定义其为下载程序.五, 下载程序如何实现中断相量的映射由于我们无法预知究竟系统会用多少中断,所以对于应用程序的中断,都必须在更新程序中做映射,即,我们在单片机的某个程序空间建立一个程序跳转表,更新程序的中断相量表做一个固定的表,对应固定地址,我们只需在固定地址放相应的跳转指令,就可以实现中断相量的映射.例题如下:地址A: JMP 地址B. JMP地址B其实是个引导程序.中断相量<1>: 地址A.其中, “中断相量<1>”地址放的”地址A”由更新程序确定,而”地址A” 地址放的” JMP地址B”,JMP由计算机来添加,”地址B”则由应用程序确定.对于复位中断,其处理方法有点不同,其实现方法如下:中断相量<1>: Main.地址A:JMP 地址B.Main:If (a>b){goto地址B }中断相量表的定义参考方法如下:void (* const _vect[])() @0xFFCC = { /* Interrupt vector table */0xf998, /* Int.no. 25 Vrti (at FFCC) Unassigned */0xf99c, /* Int.no. 24 Viic1 (at FFCE) Unassigned */…_Startup /* Int.no. 0 Vreset (at FFFE) Reset vector */};六,单片机程序注意事项1,程序空间分配下载程序的空间应该从0xfff地址向下排放,具体大小需要根据实际的大小及单片机Flash的Block大小来同时决定.空间的安排,一定是Block的倍数.应用程序的空间是从程序的最低段开始排放,除了中断向量外,不可以有任何代码地址与下载程序重叠.在用CodeWarrior来写程序时,我们可以修改PRM文件来控制程序排放地址.下面是下载程序的PRM参考代码.NAMES ENDSEGMENTSROM = READ_ONLY 0xfA00 TO 0xFFAF;Z_RAM = READ_WRITE 0x0070 TO 0x00FF;RAM = READ_WRITE 0x0200 TO 0x086F;ROM2 = READ_ONLY 0xFFC0 TO 0xFFCB;ENDPLACEMENTDEFAULT_RAM INTO RAM;DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;ENDSTACKSIZE 0x802,程序代码保护为了使下载程序在任何异常情况下不会被改写,其除了放置引导程序的空间外,均要做代码保护.其在C语言种的参考代码如下.const unsigned char NVPROT_INIT @0x0000FFBD = 0xFA;.3,计算机应用程序如何处理单片机应用程序的中断相量表计算机在应用程序处理该中断相量表时,应根据下载程序的映射关系,将两个字节的相量数据自动计算到对应引导地址,并变为JMP+地址(相量)的模式.下面是参考转变模式.单片机应用程序复位相量为0x8000,其变为跳转后的代码则为0xCC8000.如本文参考代码,其对应引导地址为0xf9fc,则计算机应用程序则应通知下载程序在0Xf9fc后写0XCC8000三个字节数据,运行完成后,反编译的代码如下:F9FC: JMP 0x80003,其它建议为保证应用程序的正确性,可以在下载程序里判断程序的校验码,可以用16位CRC码等.七,S19文件格式简介S-记录实际上是由五个部分组成的字符串的集合。
STM32的BootLoader 从SD卡更新固件

目录一、什么是BootLoader (2)二、BootLoader的作用 (2)三、BootLoader预备知识 (2)3.1 复位序列 (3)3.2 重定位中断向量表 (3)3.3 C语言函数的地址 (3)3.4 hex文件和bin文件 (5)四、分几步实现BootLoader (7)4.1 跑FAT文件系统 (7)4.2 读写Flash程序 (7)4.3 跳转到新程序运行 (8)五、具体流程 (9)5.1 主函数流程 (9)5.2 BootLoader流程 (10)5.3 跳转到新程序流程 (11)六、参考文献 (11)一、什么是BootLoader这个大家可以上网查一下,我在这里说说我自己比较片面的理解。
BootLoader就是单片机启动时候运行的一段小程序,这段程序负责单片机固件更新,也就是单片机选择性的自己给自己下程序。
可以更新也可以不更新,更新的话,BootLoader更新完程序后,跳转到新程序运行;不更新的话,BootLoader直接跳转到原来的程序去运行。
BootLoader下载新程序后并不擦除自己,下次启动依然先运行BootLoader程序,又可以选择性的更新或者不更新程序,所以BootLoader就是用来管理单片机程序的更新。
我的大概理解是这样,大家自己网上搜搜详细介绍吧。
二、BootLoader的作用BootLoader使单片机能自己给自己下载程序,所以在程序升级方面非常有作用。
比如我们的BootLoader是通过GSM更新程序的,我们在升级单片机程序的时候,只要把新程序通过GSM发送给单片机,单片机自己实现程序更新,然后跳转到新程序执行,这样就省去我们很多升级的功夫啦。
可以想象一下如果把单片机安装在非常高的地方,或者危险的工业现场,或者封装得很难拆下来,我们很难直接给单片机下载程序,那么BootLoader的作用就体现出来了。
简单的说,有了BootLoader,我们省心又省力。
BootLoader下位机开发总结

飞思卡尔HS12 BootLoader开发流程1.设置BootLoader代码装载地址该操作在Prm文件中设置,在Flash分区中加入下列代码:ROM_F000 = READ_ONLY 0xF000 TO 0xFCFF;把所有BootLoader文件存储设置为都保存在ROM_F000中,代码如下:PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */ _PRESTART, /* Used in HIWARE format: jump to _Startup at the code start */STARTUP, /* startup data structures */ROM_VAR, /* constant variables */STRINGS, /* string literals */VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment *///.ostext, /* eventually OSEK code */NON_BANKED, /* runtime routines which must not be banked */DEFAULT_ROM,COPY /* copy down information: how to initialize variables *//* in case you want to use ROM_4000 here as well, make surethat all files (incl. library files) are compiled with theoption: -OnB=b */INTO ROM_F000; //ROM_C000 /*, ROM_4000*/;2.设置进入BootLoadr 模式的flag该操作在start12文件中修改,常见的有I/O检测,延时,通信。
飞思卡尔16位单片机MC9S12XS128加密(程序下载不进去,正负极未短路,通电芯片不发烫)后解锁的方法及步骤

飞思卡尔16位单片机MC9S12XS128加密(程序下载不进去,正负极未短路,通电芯片不发烫)后解锁的方法及步骤/*****************************************************************************/ *本人用此法成功解救了4块板子【窃喜!】,此说明是本人边操作边截图拼成的,有些是在别的说明上直接截图【有些图本人不会截取,就利用现成的了,不过那也是本人用豆和财富值换来的】,表达不清之处还望见谅,大家将就着看吧!如能有些许帮助,我心甚慰!!!————武狂狼2014.4.23 /*****************************************************************************/编译软件:CW5.1版本,下载器:飞翔BDMV4.6 【1】,连接好单片机,准备下载程序,单击下载按钮出现以下界面或(图1.1)图 1.1——4中所有弹出窗口均单击“取消”或红色“关闭”按钮依次进入下一界面(图1.2)(图1.3)(图1.4)******************************************************************************* *******************************************************************************【2】单击出现如下图所示下拉列表,然后单击(图2.1)出现下图(图2.2)对话框,按下面说明操作(图2.2)弹出图2.3,单击按钮,依次出现如图2.4--5窗口,均单击(图2.3)(图2.4)******************************************************************************* *******************************************************************************【3】单击出现下拉列表,然后单击下拉列表中单击按钮出现如下界面,单击选择相对应的单片机型号(我选的红色方框里的HCS12X….),单击OK. PS:【此步骤是本人自己试出来的,若不进行此操作,图3.3中下拉列表中无要找选项】(图3.1)(图3.3)(图3.4)(图3.5)红色方框2中默认即为所要选的文件,此步只需单击确认按钮即可,如有不同读者酌情处置。
飞思卡尔FRDM-KL02Z(上手)

1、安装好你们的Keil5(论坛有如何安装)2、其次安装好PEDrivers_install.exe3、Pemicro_OpenSDA_Debug_MSD_Update_Apps_2015_10_05.zip 下载这个压缩包。
4、解压后得到这个包。
5、按住板子的复位键,然后插入USB接口。
板子进入BOOTLOADER模式。
注意了!!!Win8的用户,你们悲催了!直接往BOOTLOADER盘里面拖拽上图的A、B文件是没有用的,无法升级以及更新。
论坛上有人说,是选中文件点击鼠标右键发送到BOOTLOADER盘。
我的作法是找到了一台win7,然后按住板子的复位键,然后插入USB接口。
板子进入BOOTLOADER模式。
依次拖拽A文件,然后断电。
如果升级成功不用按住复位键,直接插入就是BOOTLOADER 模式。
然后拖入B文件。
升级成功!现在盘符变成了通过其他信息也可以验证打开一个网页正是刚才升级的内容。
右键计算机>管理>设备管理器>Jungo 最后还要看你有没有这个东西。
/*------------------------------华丽的分割线---------------------------------------------------------*/完成以上设置以后板子就可以下载程序了。
打开一个例程。
有些例程可能无法编译,所以选择了这个串口程序。
进入setting选择我所选取的这两个。
点击load即可下载。
下载成功后,由于已经生成了虚拟串口。
所以直接打开一个串口查看程序,找到COM口就可以查看了。
下载完成!!!调试通过。
同学们可以自行学一下OpenSDA很强大的一个东西。
恭喜你们已经上路了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于飞思卡尔的Bootloader程序下载更新前言写这篇文档是因为大三暑假时在一家公司实习,做一个基于飞思卡尔的bootloader远程更新项目,刚开始定的技术指标是基于MC9S12XS128单片机的Bootloader程序、远程(基于GSM网络)和CAN总线通信。
但因为我只是一个本科实习生而且实习时间只有一个多月,所以只完成了基于SCI的本地写入.S19文件的更新。
这大概也就是这篇文档所包含的内容啦。
整个程序是存在瑕疵甚至基本上可以说是不成功的,但是我觉得自己在做这个项目的过程中确实也解决了网上没有提到或者没有答案的一些问题,特写此文档,希望大家各取所需,如果有什么高见或者发现了我明显错误的地方,也非常欢迎大家给我指出。
欢迎大家前来指教。
小目录一、Bootloader的含义---------------------------------------------------------2二、SCI串口的使用------------------------------------------------------------3三、Flash的擦除和写入--------------------------------------------------------5四、.S19文件的写入-----------------------------------------------------------13五、心得体会-----------------------------------------------------------------14一、Bootloader的意义与作用关于Bootloader的意义网上非常之多,这里针对单片机的Bootloader程序进行说明。
Bootloader是在单片机上电启动时执行的一小段程序。
也称作固件,通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用应用程序准备好正确的环境。
Boot代码由MCU启动时执行的指令组成。
这里的loader指向MCU的Flash中写入新的应用程序。
因此,Bootloader是依赖于特定的硬件而实现的,因此,在众多嵌入式产品中目前还不可能实现通用Bootloader。
Bootloader的最大优点是:在不需要外部编程器的情况下,对嵌入式产品的应用代码进行更新升级。
它使得通过局域网或者Intemet远程更新程序成为可能。
例如,如果有5000个基于MCU的电能表应用程序需要更新,电能表制造商的技术人员就可以避免从事对每一个电能表重新编程的巨大工作量,通过使用Bootloader的功能,由控制中心通过电能表抄表系统网络,远程对5 000个电表重新编程。
可见,Bootloader功能对于嵌入式系统的广泛应用具有十分重要的意义。
再举一个例子。
就拿我自己做这个程序的目的来说,我所在的公司将自己的产品卖到全国各地,如果哪一天公司的底层软件工程师(单片机工程师)想要升级底层软件,就可以借助GSM网络直接通过单片机中的Bootloader程序进行底层软件的自我更新,而不是派出售后人员一台一台的进行更新,节省了大量的人力物力。
注意点:平时我们最常用到的下载程序的方法是通过USB数据线或其他数据线进行程序的烧写,这个方式是通过外界提供给单片机高电压来对flash擦除和写入完成的。
而Bootloader不需要外界提供高电压仅靠正常工作电压便可完成对flash的擦除和写入,从而达到更新程序的目的。
二、SCI串口的使用前面也提到,我做的是通过SCI串口的本地更新。
SCI(Serial Communication Interface,串行通信接口)是最常用、最经典的串行通信接口方式。
通信双方除了要按照约定的真个是进行数据通信外,还要约定相同的通信速率,在SCI通信中使用波特率来表示。
串行通信的波特率被定义为每秒内传送的位数,单位为b/s或bps,常用的波特率有1200bps,4800bps,9600bps,19200bps,38400bps等。
SCI的使用主要注意两点:波特率的设置和工作方式的选择,我选择的是中断工作方式。
波特率:设置波特率的主要目的是使单片机和上位机(上位机在这里就指将信息发给单片机的PC端)保持同步。
MC9S12XS128的波特率寄存器是SCIBDH和SCIBDL,总共16位但是只有13位可以写入。
SBR[12:0]:波特率常数,取值1~8191.波特率发生器的时钟输出是由MCU内部总线时钟BUSCLK分频而来,SBR[12:0]就是分频系数,而SCI模块需要的工作时钟为波特率的16倍。
SCI的波特率计算公式如下:SCI=f BUS/(16*SBR[12:0])波特率的计算数结果些许误差可以忽略,以约等于常见通用的串行通信波特率数值。
说了一大堆,到底如何设置不同的波特率呢,通过具体的程序代码来体现一下。
#define SCIBusClock 8000000// MC9S12XS128的总线时钟是8MHz #define SCI38400bps (unsignedint)((unsignedlong)(SCIBusClock)/(unsignedlong)(614400))//38400 * 16 38400波特率#define SCI19200bps (unsigned int)((unsigned long)(SCIBusClock) / (unsignedlong)(307200))//19200 * 16 19200波特率#define SCI9600bps (unsigned int)((unsigned long)(SCIBusClock) / (unsigned long)(153600))// 9600 * 16 9600波特率#define SCI4800bps (unsigned int)((unsigned long)(SCIBusClock) / (unsigned long)(76800))// 4800 * 16 4800波特率#define SCIBaudRate SCI9600bps //大多数情况下用9600波特率中断工作方式:选择中断的工作方式,一有数据从SCI串口输出,单片机便立马进行接收处理。
主要对SCI0CR1和SCI0CR2进行操作。
SCI0CR2=0x2C; //0010 1100 RIE=1,TE=1,RE=1//RIE=1 接收数据寄存器满和重叠中断请求使能//TE=1 发送器使能//RE=1 接收器使能具体的数据接收代码为://SCIReceiveN:串行接收N个字节数据------------------------------------------*byte SCIReceiveN(void){while (!SCI0SR1_RDRF);//如果SCI0SR1_RDRF为1则表示数据起存器接收到的数据有效return SCI0DRL;//返回接收到的值,即SCI数据寄存器SCIDRL中的数据}温馨提醒:SCI程序到底对不对,有没有正常的工作,还是要通过上位机来观察。
这就牵扯到用什么软件来作为单片机和上位机的接口。
网上很多资料推荐一款很经典的软件“超级终端”,但是我个人认为这款软件太“经典”啦,太老啦,导致我一直不知道怎么用的。
如果大家也遇到了这个问题,那么我向大家推荐“友善串口调试”,完全的免费,而且界面简洁,使用简单,英文名为“Serial Port Utility”。
三、Flash的擦除和写入关于Flash的擦除和写入,真的是让我最费力的一部分,网上的相关资料很少,好不容易找到了一点相关代码,却发现程序不能正常的运行,而且更令人无解的是程序本身怎么检查都检查不出错误。
好啦,一点一点的说说我的辛酸史。
首先,如果你在寻找飞思卡尔的flash擦除写入操作,很遗憾的告诉你,如果你用的不是MC9S12XS系列,那么很有可能,你所需要的flash擦除写入操作和我接下来将要说明的擦除写入操作基本上不沾边(除了原理上),因为飞思卡尔不同系列的单片机对flash的擦除写入操作的定义差别很大,不注意型号的话反而会被误导。
至于擦除和写入的原理是什么,这个不是我们关心的,我也不去赘述,我主要说明一下相关的具体操作。
我们主要是对飞思卡尔Flash中的PFlash即存放程序段的Flash进行操作。
如图,步骤大概分为:1、设置Flash分频寄存器:Flash的操作对频率有一定的要求,过低擦除不成功,过高会损毁Flash如图为MC9S12XS128的FCLKDIV寄存器,所有位都是可读的但是只有7位可写入。
至于应该如何设置分频数,有一张表格可以参考:如表格说明,分频数是根据外部时钟来定的,MC9S12XS128的外部时钟是16MHz,所以我选择了0x10作为分频数。
给出一一些具体的代码:/************************************************************* 名称:void PFlash_Init(void)** 功能:PFlash初始化** 入口参数:无** 出口参数:无** 使用说明:无************************************************************/void PFlash_Init(void){while(FSTAT_CCIF==0);//等待正在处理的Flash操作,即CCIF=1时,操作完成FCLKDIV=0x10;//外部晶振为16MHz,Flash时钟设置为1MHzFCNFG=0x00; //禁止中断while(FCLKDIV_FDIVLD==0); //等待时钟设置成功,即FDIVLD为1时设置成功}这里补充一下对FCLKDIV_FDIVLD的说明:说明很简单,一看就看懂。
2、FSTAT状态寄存器在上面的代码中出现了一行,这就涉及到一个很重要的寄存器,就是Flash操作的状态寄存器,就像是Flash操作步骤中的“红绿灯”一样,告诉程序什么时候可以执行什么操作,什么时候必须要等待一下。
如图:其中我们比较关心的是CCIF位、ACCERR位和FPVIOL位,这三位也都是可读可写的。
CCIF:指令完成标志位,当CCIF位为1时,表示上一个Flash操作完成了。
注意图中的高亮部分,如果想要使当前操作的指令完成,需要手动将CCIF清零(标志位置位就是令标志位为0,但具体操作是令标志位等于1),才能触发指令,令指令完成,也就是前面流程图中说明的,才能launch指令。
ACCERR和FPVIOL:这两位主要标志是否有错误操作发生,当为1时,说明检测到错误。