简介:TMS570LS系列提供高效可靠的闪存存储解决方案,涵盖多种Flash读写操作功能。此系列微控制器支持灵活的数据处理与安全特性,适用于汽车电子和其他嵌入式系统。
### TMS570LS系列FLASH读写操作
#### 知识点概述
本段落档针对在调试TMS570LS系列微控制器读写片内FLASH BANK0时遇到的问题进行了详细的分析与解决。TMS570LS是德州仪器(TI)推出的一款高性能安全微控制器,广泛应用于汽车电子、工业自动化等领域。该系列微控制器集成了多种安全特性,并提供了丰富的外设资源,包括片上闪存。在进行固件开发的过程中,正确地管理和操作片内闪存对于确保系统的稳定性和安全性至关重要。
#### 问题现象及原因分析
在对TMS570LS系列中的不同型号进行测试时,发现了一个共同的问题:当尝试读写BANK0时,首次执行erase操作就会触发“undefEntry”异常,导致程序异常终止。进一步分析后确定了以下几点:
- **测试3137**:该型号具有BANK0和BANK1两个闪存区,其中BANK1的操作一切正常,但BANK0在初次执行erase操作时出现问题。
- **测试1224**:这款型号仅包含BANK0,在进行BANK0的第一次erase操作时出现同样的错误。
- **原因**:根据TI提供的文档(SPNU501.pdf)第2.3.4节所述,使用F021 Flash API无法直接操作自身所在的位置,即BANK0。
#### 解决方案详解
为了解决上述问题,需要对编译链接器脚本进行调整,以便将Flash API相关的代码移动到RAM中执行。具体的解决方案分为以下几个步骤:
1. **增加FLASH API内容空间分配**:在编译链接器脚本(cmd文件)中添加了新的段`FLASH_API`,用于存储Flash API相关的代码。此段定义如下:
```plaintext
MEMORY
{
VECTORS(X): origin=0x00000000 length=0x00000020
FLASH_API(RX): origin=0x00000020 length= 6KB
FLASH1(RX): origin=... // 具体大小根据微控制器型号而定
SRAM(RW): origin=...
STACK(RW): origin=...
}
SECTIONS
{
.intvecs:{} >VECTORS
flashAPI:
{
..DebugupdatesrcFapi_UserDefinedFunctions.obj(.text)
..Debugupdatesrcbl_flash.obj(.text)
--library=..updatelibF021_API_CortexR4_BE.lib<
FlashStateMachine.IssueFsmCommand.obj
FlashStateMachine.SetActiveBank.obj
FlashStateMachine.InitializeFlashBanks.obj
FlashStateMachine.EnableMainSectors.obj
Init.obj
Utilities.CalculateEcc.obj
Utilities.WaitDelay.obj
Utilities.CalculateFletcher.obj
Read.MarginByByte.obj
Read.Common.obj
Read.FlushPipeline.obj
Async.WithAddress.obj
Program(obj>(.text)
} load=FLASH_API, run=SRAM, LOAD_START(api_load), RUN_START(api_run), SIZE(api_size)
.text>FLASH1
.const>FLASH1
.cinit>FLASH1
.pinit>FLASH1
.data>SARM
.bss>SARM
}
```
这里定义了`FLASH_API`段的起始地址为0x00000020,长度不超过6KB,并将所有Flash API相关的对象文件和库文件链接到这个段。
2. **实现从FLASH复制API到RAM的汇编函数**:为了确保Flash API能够顺利执行,在`sys_core.asm`文件中添加一个用于将Flash API从闪存复制到RAM中的汇编函数`_copyAPI2RAM_`。具体实现如下:
```assembly
;-------------------------------------------------------------------------------
; Copy the Flash API from flash to SRAM.
;
.def _copyAPI2RAM_
.asmfunc
_copyAPI2RAM_
.ref api_load
flash_load.word api_load
.ref api_run
flash_run.word api_run
.ref api_size
flash_size.word api_size
ldr r0, =flash_load
ldr r1, =flash_run
ldr r2, =flash_size
add r2, r1, r2
copy_loop1:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r1, r2
blt copy_loop1
bx lr
.endasmfunc
;-------------------------------------------------------------------------------
```
此函数通过循环从闪存中的`api_load`地址复制数据到RAM中的`api_run`地址,直到复制完`api_size`指定的大小为止。
3. **在启动代码中调用复制函数**:最后一步是在系统启动代码(`sys_startup.c`)中调用上述定义的`_copyAPI