最近自己做了一个基于EasyARM2200开发板的bootloader,作用是可以将别的程序通过串口烧入片外SST39VF160 FlashROM并启动该程序。主要分以下几部分:
一.串口编程
将ADS生成的Plain binary文件(不是Intel 32 bit Hex)发送至开发板的UART0串口,然后写入片外RAM。我没有编写上位机程序,直接用网上的串口收发软件。这种软件虽然能发送二进制文件,但它是一次性发送,无法效验,如果文件太大可能会出问题。理想的方法是分块发送,并在每个块发送结束后,对每个块进行校验,以确保数据的正确,这点工业应用领域很重要。LPC2000系列的ARM芯片的UART0为16字节FIFO,可设置中断的触发深度。有一点要注意,RBR中断包含了两个中断源,一是接收数据可用(RDA)中断,即正确接收到数据;二是接收超时中断(CTI)。当接收的数据量不满足触发深度,且在接收3.5到4.5字符时间内没有发生UART0 RX FIFO动作时,产生CTI中断。
二.Flash编程
将已写至片外RAM的代码烧入SST39VF160,并校验。
1.编程时要注意变量的位数,如果在0x5555地址写入16位的0xAA,则变量为16位,且低8位为0xAA即可。
2.SST39VF160为16位FlashROM,而ARM内存地址为8位,则Flash地址向ARM地址转换时要左移一位。
3.Flash字编程只能从1变到0,不能从0变到1。只有擦除操作才能变为1。
三.其它程序
启动时通过串口发送两字节来控制是从片外Flash启动还是烧写片外Flash。如果选择启动,则检测SST39VF160中的代码是否有效,有效则启动;无效转入烧写程序。
烧写完以后直接跳到SST39VF160的首地址执行,开始我以为可能执行不了,因为没有进行Reset。我个人觉得Reset是把那个二进制文件在内存中重新Remap的一个过程,根据分散加载文件在内存中重新映像。但现在还是可以执行,不知道是什么原因。感觉对启动这一块的理解还不够深入。
又看了一下ADS Developer Guild,里面说Reset不会为用户代码做任何事,任何事都要由代码自己来完成。比如Remap,除了在分散加载文件,程序还要自己将相应的代码移动到需要的区域中。