在应用编程MAXQ微控制器中可分区擦除的程序和数
时间:03-19
来源:互联网
点击:
上面列出的应用ROM闪存例程,可完成闪存ROM所需要的所有擦除和写入操作,从而允许用户代码对闪存进行操作。与其他子程序调用相似,程序执行完成之后,控制将返回到用户代码。
要实现可靠的IAP,引导装载程序必须与主程序分开。这样可以确保在经历一次未竟编程之后,可以重新启动编程过程。
引导装载程序
初始化以后,由于ROM跳转至地址0x0000,因此,引导装载程序的入口应为0x0000。不同的MAXQ器件,其引导闪存分区的大小也不相同。可以根据需要,将引导程序扩展至多个闪存分区,用户应用程序代码不能使用已被占用的任何分区。擦除和写入闪存时必须满足的特定要求见表6。
表6. 调用应用ROM闪存例程的要求
You cannot erase or program from the same flash sector from which you are executing code. This is not normally a problem since the flash Boot Sector should never be erased during IAP. |
The watchdog must not be enabled or the watchdog timeout must be set long enough to complete this routine without triggering a reset before the flashEraseSector() routine is called. If the watchdog time out occurs before the erase is complete, it will reset the part. Erasing a sector typically takes 0.7 seconds; it can take up to 15 seconds under worst case conditions. |
Since the System Control Register bit SC.UPA must be set to 0 to access the Utility ROM, a ROM Utility routine cannot be called directly from program memory addresses = 0x8000. If access to a Utility ROM routine is required from a program in upper memory (= 0x8000), the program must indirectly call the ROM routine through a routine residing in lower memory (0x8000). This effectively limits the boot loader to = 64kB (32kB x 16). |
图4中的流程说明了脱离复位状态后MAXQ的操作。ROM进行自诊断并确定闪存已经准备好以后,ROM初始化代码直接跳转到地址0x0000。请阅读相关的数据手册和用户指南,确定您的MAXQ微控制器是否按照这个启动顺序运行。
图4. ROM初始化流程示意
图5给出了一个简单的引导装载程序的流程图。当使用引导装载程序实现IAP时,对于16kB (8K x 16)的引导装载程序,主应用程序的入口通常位于地址0x2000 + 标题偏移,对于32kB (16K x 16)的引导装载程序,则位于地址0x4000 + 标题偏移。一个简单的应用程序标题如下所示:
typedef struct {u16 iSize; // The size of the application in wordsu32 iCRC; // The CRC of the applicationu8 ID[8]; // ID string for current application} APPLICATION_HEADER;引导装载程序可以利用此标题所提供的信息确定主程序的有效性,如果需要,还可以报告其版本标识。
图5. 闪存引导装载流程示意图
编程过程本身非常简单。首先调用flashEraseSector(),擦除含有主程序代码的每个分区。然后调用flashWrite()逐字写入要编程的代码字。应最先擦除含有应用程序标题的块,而最后编程CRC数据,以便将出现错误CRC匹配的概率降到最低。下面给出通过串口获取数据来刷新微控制器的一个简单例程:
/*// VerySimpleReFlash()// As simple as it gets.// Step 1. Wait for erase command, then erase flash.// Step 2. Wait for program command, then program flash one word// at a time.*/void VerySimpleReFlash(){u16 iStatus; // The status returned from flash utility ROM callsu16 iSize; // The size of the main code to programu16 *pAddress = 0x2000; // The starting address of the main applicationInitializeCOMM(); // Can be CAN or UARTWaitForEraseCommand();SlowDownWatchdog(); // If watchdog enabled set update > 15siStatus = flashEraseSector(C_ADDRESS_SECTOR_1);if (iStatus == 0)iStatus = flashEraseSector(C_ADDRESS_SECTOR_2);UpdateWatchdog(); // Prevent watchdog timeoutSendFlashErasedResponse(iStatus);if (iStatus)ResetMicro();iSize = WaitForProgramCommand();while (iSize--){u16 iData = GetWordFromCOMM();iStatus = flashWrite(pAddress, iData);if (iStatus)break;++pAddress;UpdateWatchdog(); // Prevent watchdog timeout}SendFlashWriteResponse(iStatus);ResetMicro();}那些引导装载程序没有使用的程序空间,可用于其他例程和/或常数的存储。一个很好的例子是将间接调用应用ROM例程的所有子程序保存在这里,例如上面“应用ROM闪存例程”中所给出的一些子程序。在引导程序分区存储其他信息时需要注意:除非部分或全部擦除引导装载程序自身,否则无法将其擦除。
- 智能铅酸蓄电池充电器的设计(01-02)
- 用微控制器或 DSP 电路控制开机/关机功能(06-22)
- 微控制器的市场前景及发展趋势(06-21)
- 基于AT89S52汉字多方式显示屏的设计(01-06)
- 灵活高效的数字解决方案满足新兴电源管理需求(01-10)
- 基于ARM微处理器的十回路智能配电监控单元的设计(11-17)