微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 模拟电路设计 > 在应用编程MAXQ微控制器中可分区擦除的程序和数

在应用编程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闪存例程”中所给出的一些子程序。在引导程序分区存储其他信息时需要注意:除非部分或全部擦除引导装载程序自身,否则无法将其擦除。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top