离线加密编程器中的BootLoader程序设计
3.2 编程器与目标板的通信
编程器通过SPI总线与目标板建立连接。当进行目标板的编程时,首先编程目标板的 BootLoader区引导程序。引导区程序编程完毕后,编程器与目标板进行通信,将加密数据传送给目标板。目标板的BootLoader程序接收到加密数据后进行CRC校验。如果校验失败,Boot—Loader要求编程器重新发送数据;如果校验通过,对加密数据进行解密,然后写入Flash。编程器与目标板通信流程如图4所示。
4.1 BootLoader。介绍
BootLoader区位于单片机内部Flash的最高地址,BootLoader存储器空间的大小可以通过熔丝位进行配置。BootLoader为通过 MCU本身来下载和上载程序代码提供了一个真正的同时读一写自编程机制(Read—While—Write,RWW)。这一特点使得系统可以在MCU的控制下,通过驻留于程序Flash的BootLoader,灵活地进行应用软件升级。BootLoader可以使用任何器件具有的数据接口和相关的协议获得代码并把代码(程序)写入闪存,或者是从程序存储器读取代码。BootLoader区的程序可以操作整个闪存,包括BootLoader区,因而 BootLoader可以对其自身进行修改,甚至将自己擦除。如果系统已经不再需要BootLoader,则可以通过指令控制BootLoader程序,将BootLoader区擦除。
4.2 BootLoader区程序的设计思想
由于目标板上AVR单片机种类的不同,所包含的头文件也不尽相同,而且BootLoader区的大小也是根据目标板的不同而不同,所以存储芯片中 BootLoader程序代码要满足当前主流的AVR单片机的需求。另外由于存储芯片容量大小的限制,要求引导程序要短小精炼。
编程BootLoader区的一个重要的内容是熔丝位的编程,熔丝位编程出错可能导致编程的失败。写SPIEN为“1”,导致编程器与目标板无法建立连接;写RSTDISBL为“O”,将导致复位引脚失效;写CKSEL熔丝位出错,将导致内外部晶振的选择混乱,从而导致编程失败。
BootLoader程序编程步骤:
①配置BOOTSZl和B00TSZ0熔丝位,设定Boot—Loader区的大小:
③下载BootLoader程序的HEX文件。下载时要注意BootLoader区的起始位置。
④设置的Boot锁定位,保护BootLoader不被破坏,使其只能通过芯片擦除命令清除BootLoader区的程序。
5 BootLoader程序的下载
编程器外存中存储适合各种型号AVR单片机的BootLoader源代码。在下载BootLoader程序之前,首先在编程器外存中找到适合目标板单片机型号的Boot—Loader程序,然后下载到目标板。主要设计问题是数据的传输、熔丝位和锁定位的编程、Flash的读写。
5.1 实 例
本设计采用串行编程模式,串行接口包括RESET、SCK、MOSI(输入)及MISO(输出)四条线。当RESET为低电平时,可以通过串行 SPI总线对Flash进行编程,应在执行编程或擦除操作之前执行编程使能指令。下面以ATmegal69为例,给出一个实际的程序。
首先对SPI接口进行初始化SPI_MasterInit(),并使能操作SPI_Enable(),然后擦除Flash页SPI_Erase(),进行 Flash的页写操作program_bootloader(),再写熔丝位SPI_WriteFuse和写锁定位SPI_WriteLock,最后进行复位操作SPI_Over()。
5.2 串行编程应遵循的步骤
①上电过程:在RESET及SCK为0时,向VCC及GND供电。在一些系统中,编程器不能保证在上电时SCK保持为低。在这种情况下,SCK拉低之后应在RESET加一正脉冲,而且这个脉冲至少要维持2个CPU时钟周期。
②上电之后等待至少20 ms,然后向MOSI引脚输入串行编程使能指令以使能串行编程。
③通信不同步将造成串行编程失败。同步之后,在发送编程使能指令的第3个字节时,第2个字节的内容(0x53)将被反馈回来。不论反馈的内容正确与否,指令的4个字节必须全部传输。如果0x53未被反馈,则需要向RESET提供一个正脉冲以开始新的编程使能指令。
④Flash的编程以一次一页的方式进行。页的大小为128字节。在执行加载程序存储页指令时,通过6位的地址信息,数据以字节为单位加载到存储页。为保证加载的正确性,应先向给定地址传送数据低字节,之后是高字节。程序存储页通过地址的高8位以及写程序存储器页指令获得数据。如果不使用查询的方式,那么在操作下一页数据之前应等待至少4.5 ms。在Flash写操作完成之前访问串行编程接口,会导致编程错误。
⑤可通过读指令来校验任何一个存储单元的内容。数据从串行输出口MISO输出。
⑥编程结束后可以将RESET拉高,开始正常操作。
⑦下电序列:将RESET置“1”。
结语
在一般的开发过程中,每次进行程序的调试和更新都要将产品与PC机直连,进行在线操作,这样就限制了程序调试和更新的场所。离线加密编程器的设计避免了这种场所的限制。编程器只有普通的火柴盒大小,功能完善且携带方便,这样可以将已编写好的程序存储在编程器中,然后将编程器带到所需场所(特别是在恶劣的工业现场和野外)对产品进行再编程。本设计采用 BootLoader引导区程序进行数据的解密和编程操作,既达到了对知识产权进行保护的目的,又方便了程序的调试和更新。
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)