在应用编程MAXQ微控制器中可分区擦除的程序和数据闪存
[09-13 17:04:32] 来源:http://www.88dzw.com 控制技术 阅读:8553次
文章摘要:图4中的流程说明了脱离复位状态后MAXQ的操作。ROM进行自诊断并确定闪存已经准备好以后,ROM初始化代码直接跳转到地址0x0000。请阅读相关的数据手册和用户指南,确定您的MAXQ微控制器是否按照这个启动顺序运行。 图4. ROM初始化流程示意 图5给出了一个简单的引导装载程序的流程图。当使用引导装载程序实现IAP时,对于16kB (8K x 16)的引导装载程序,主应用程序的入口通常位于地址0x2000 + 标题偏移,对于32kB (16K x 16)的引导装载程序,则位于地址0x4000 + 标题偏移。一个简单的应用程序标题如下所示: typedef struct { u
在应用编程MAXQ微控制器中可分区擦除的程序和数据闪存,标签:计算机控制技术,工厂电气控制技术,http://www.88dzw.com图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 words u32 iCRC; // The CRC of the application u8 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 calls u16 iSize; // The size of the main code to program u16 *pAddress = 0x2000; // The starting address of the main application InitializeCOMM(); // Can be CAN or UART WaitForEraseCommand(); SlowDownWatchdog(); // If watchdog enabled set update > 15s iStatus = flashEraseSector(C_ADDRESS_SECTOR_1); if (iStatus == 0) iStatus = flashEraseSector(C_ADDRESS_SECTOR_2); UpdateWatchdog(); // Prevent watchdog timeout SendFlashErasedResponse(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闪存例程”中所给出的一些子程序。在引导程序分区存储其他信息时需要注意:除非部分或全部擦除引导装载程序自身,否则无法将其擦除。
采用基于RAM的闪存例程实现IAP
当不要求故障恢复时,可采用基于RAM的闪存例程来刷新MAXQ微控制器。该方法要求主程序拷贝一个小的、可再定位的闪存编程例程到RAM中,然后再跳转到该例程。表7列出了从RAM中执行代码需要注意的几个限制。
表7. 从RAM中执行代码的限制
SC.UPA must be set to 0 before executing a RAM-based routine. This means that the application must jump to the RAM routine from the code segments P0 & P1. |
RAM cannot be accessed as data and program at the same time. This means that only the registers and hardware stack are available for data storage. |
The Interrupt Vector must point to a RAM routine if interrupts are enabled. Typically interrupts are turned off and polling is used due to the simplicity of the RAM reflash routine. |
闪存例程一般通过UART或者CAN接口来进行通信。为实现更可靠的错误恢复机制,最好是接收小的数据包,并发送某种类型的确认信息。图6给出了一个更新例程。记住,在掉电之前,如果没有成功完成重新编程,需要通过JTAG端口对微控制器重新编程。
图6. 简化的RAM更新例程流程图
Tag:控制技术,计算机控制技术,工厂电气控制技术,控制技术
《在应用编程MAXQ微控制器中可分区擦除的程序和数据闪存》相关文章
- › 在应用编程MAXQ微控制器中可分区擦除的程序和数据闪存
- 在百度中搜索相关文章:在应用编程MAXQ微控制器中可分区擦除的程序和数据闪存
- 在谷歌中搜索相关文章:在应用编程MAXQ微控制器中可分区擦除的程序和数据闪存
- 在soso中搜索相关文章:在应用编程MAXQ微控制器中可分区擦除的程序和数据闪存
- 在搜狗中搜索相关文章:在应用编程MAXQ微控制器中可分区擦除的程序和数据闪存
分类导航
最新更新