主题中讨论的其他器件:SysConfig、 MSPM0G3507、MSPM0L2228、 LP-MSPM0G3507
工具与软件:
大家好!
运行、则会发生以下意外行为。
当向闪存写入一个值并再次读取它时、在读取时会发生意外中断。 中断是否发生也取决于该值。 根据 xPSR 寄存器、它应该是异常10
很遗憾、例外10在参考手册中没有详细描述、并且被签名为"保留"。
您能为我提供指导吗? 提前感谢
Jens
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
大家好!
运行、则会发生以下意外行为。
当向闪存写入一个值并再次读取它时、在读取时会发生意外中断。 中断是否发生也取决于该值。 根据 xPSR 寄存器、它应该是异常10
很遗憾、例外10在参考手册中没有详细描述、并且被签名为"保留"。
您能为我提供指导吗? 提前感谢
Jens
嗨、Sal、嗨、Bruce、
杨明在问我这个问题。
我知道你是对的。 这就是带有检测到闪存双错(由 ECC 引起)原因的 NMI。
我读出整个闪存、看起来好像没有生成 ECC。 我使用命令 DL_FlashCTL_programMemoryFromRAM64WithECCGenerated 写入闪存。 根据我正确理解 DL 文档、此命令应自动创建 ECC 字节。 但事实并非如此。 是否必须单独打开 ECC 生成? SysConfig 中的任何位置? 我找不到任何东西。
如果生成了 ECC 字节、它将位于哪里? 由于参考手册指出、使用 ECC 时闪存字大小为64位和72位、因此我假设它直接位于写入的数据后面。
例如
数据-> 0x100 - 0x107
ECC -> 0x108
对吗?
感谢您的支持
Timo
尊敬的 Timo:
由于闪存 ECC 代码的大小为1KB、因此可以只覆盖闪存中8kB 的区域。 对吗?
是的、这也是我在看桌子时感到困惑的地方。 我想这可能是个拼写错误、或者有一些新特性我不知道。
如果您查看我们的 MSPM0G 器件、会发现下面显示了合理区域:
如果在这个主题上有任何进展、我可以在这里进行更新。 但我认为这不是你关心的关键问题。
我不需要 ECC、但我遇到了问题。 可以全局禁用 ECC?[/QUOT]遗憾的是、 此选项启用默认设置、出于安全原因无法禁用。
[报价 userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5300996 #5300996"]我知道我可以读出偏移量为0x0040.0000的闪存。 [报价]是的。
另一种方法是将闪存 API 函数与 ECC_Generated 一起使用、API 函数可以帮助用户使用数据自动设置正确的 ECC 位。
B.R.
SAL
尊敬的 Sal:
如果查看 MSP0G 器件的表、我会猜测这不是单独的存储器区域、而是更多的偏移量来读取此闪存区域的 ECC 值。 这又提出了一个问题、ECC 值存储在哪里。
我已使用 ECC 命令 DL_FlashCTL_programMemoryFromRAM64WithECCGenerated。 我假设这将在后台组织所有必要的工作。 但是、无论如何、我遇到了这个问题。 我也尝试了没有 ECC 的版本,但没有改进。
该 API 说明指出不应禁用 ECC 生成。 您说无法停用。 不过、我是否可以检查它是否配置正确? 顺便说一下、说明和库中也有一些拼写错误。
最后一个问题、我是这样理解的、如果我在 ECC 中使用 API 函数、那么一切都应该按预期工作、应该没有问题出现。 但我的问题可能是什么? 写入没有问题、调试器可以读取该值。 仅当我在闪存中读取该值时、DED 中断才会上升。 这取决于我写入的值。 例如、0x55为正常状态、0xAA 表示 Error。 MSPM0L 器件是否存在问题? 我试了两个部分。
非常感谢
尊敬的 Timo:
[quote userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5301390 #5301390(2002) ECC 值存储在哪里。我尚未在 M0Lx22x 器件中对其进行测试。 因此、我可能需要一些时间才能了解该器件是否有任何新功能、因为该器件具有可能导致推理的双闪存组。
[报价 userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5301390 #5301390(2002)我已使用 ECC 命令 DL_FlashCTL_programMemoryFromRAM64WithECCGenerated。 [报价]是的、这应该不会有问题。 我可能会在下周用该器件进行试、它也会让我感到困惑。 顺便说一下、您能否在此处分享您的代码供我参考。
[quote userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5301390 #5301390(2002) API 说明指出不应禁用 ECC 生成。是的、实际上、用户没有用于禁用此功能的接口。 至少在 MSPM0G 器件中不是。 我认为这两个器件的闪存 IP 是相同的、或者 TRM 中应该给出一些说明。
[quote userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5301390 #5301390(2002)顺便说一下、说明和库中也有一些拼写错误。希望这不会让你感到困惑。 我完全同意应该在未来发布版本中更正此拼写错误。
[quote userid="613603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1384458/lp-mspm0l2228-xpsr-register-vaule-10d-reserved/5301390 #5301390(2002)例如、0x55没问题、0xAA 显示错误。看起来您没有正确加载 ECC。
我知道、ECC 只能检测到双位错误、如果输入的错误位超过两位、则可以检测到错误、但无法检测到错误。 因此、您写入的变量与0xFF 有四位的差异、这是合理的。 您可以尝试一位差异、例如0xFE、0xFD、并检查是否始终发生 FLASHSED。
B.R.
SAL
尊敬的 Sal:
这是我的测试代码、我得到错误。 地址0x108由链接器擦除、不包含程序代码。 其他地址也会显示错误、但不是所有地址。 只有 dataWrite 的第一个字节很有趣。
您是对的、如果我从1位到0xFF 有差异、它是有效的。 但0x55也具有4位的差异、并且也可以工作。 尽管如此、我同意我的 ECC 可能未正确设置、但为什么呢?
int main (void)
{
静态 const uint32_t 地址= 0x108;
SYSCFG_DL_init ();
DL_FLASHCTL_COMMAND_STATUS gCmdStatus;
uint8_t *数据;
uint8_t dataWrite[8]={0xAA、0x00、0xFF、0xFF、0xFF、 0xFF、0xFF、0xFF};
数据=(uint8_t*)地址;
printf ("ADR:0x%X data:0x%X\n"、address、* data);
DL_FlashCTL_unprotectSector (FLASHCTL、ADDRESS、DL_FLASHCTL_REGION_SELECT_MAIN);
gCmdStatus = DL_FlashCTL_programMemoryFromRAM64WithECCGenerated (FLASHCTL、address、(uint32_t*)&dataWrite);
uint8_t test =* data; //此行中会出现错误
printf ("ADR:0x%X data->0x%X\n"、address、* data);
while (1);
}
void NMI_Handler(){
while (1);
}
好的、我发现链接器文件很重要。 我创建一个新项目 来演示我的问题。 是否有可能共享一个空洞项目?
但现在、我在这里加载代码。 为 L2228创建了一个新的空示例、并在 syscfg 中停用链接器文件生成。
我有一个数组在闪存中的指定位置(DATA[10])。 在这个数组中、我想写入。 仅当我写入定义的数组时才会发生错误。 但并非总是、地址0x20000有效、而在下一个地址0x20008处会在我这边发生错误。 写操作符合预期。
我的方法有什么问题吗?
main.c ->
#include "ti_msp_dl_config.h" #include <stdint.h> #include <stdio.h> static const volatile uint8_t data[10] __attribute__((used, section(".my_data")))= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; int main(void) { static uint32_t address = 0x20000; SYSCFG_DL_init(); DL_FLASHCTL_COMMAND_STATUS gCmdStatus ; uint8_t *data; uint8_t dataWrite[8] = {0xAA, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; while(1){ data = (uint8_t*)address; printf("adr:0x%X data:0x%X\n",address, *data); DL_FlashCTL_unprotectSector(FLASHCTL, address, DL_FLASHCTL_REGION_SELECT_MAIN); gCmdStatus = DL_FlashCTL_programMemoryFromRAM64WithECCGenerated(FLASHCTL, address, (uint32_t*) &dataWrite); uint8_t test = *data; // in this line the error occurs printf("adr:0x%X data->0x%X\n",address, *data); address += 0x08; } while(1); } void NMI_Handler(){ while(1); }
device_lincer.cmd ->
-uinterruptVectors --stack_size=256 MEMORY { FLASH (RX) : origin = 0x00000000, length = 0x00020000 DATA (RX) : origin = 0x00020000, length = 0x00020000 SRAM (RWX) : origin = 0x20200000, length = 0x00008000 BCR_CONFIG (R) : origin = 0x41C00000, length = 0x000000FF BSL_CONFIG (R) : origin = 0x41C00100, length = 0x00000080 } SECTIONS { .intvecs: > 0x00000000 .text : palign(8) {} > FLASH .const : palign(8) {} > FLASH .cinit : palign(8) {} > FLASH .pinit : palign(8) {} > FLASH .rodata : palign(8) {} > FLASH .ARM.exidx : palign(8) {} > FLASH .init_array : palign(8) {} > FLASH .binit : palign(8) {} > FLASH .TI.ramfunc : load = FLASH, palign(8), run=SRAM, table(BINIT) .my_data : palign(8) {} > DATA fill = 0xFFFFFFFF .vtable : > SRAM .args : > SRAM .data : > SRAM .bss : > SRAM .sysmem : > SRAM .stack : > SRAM (HIGH) .BCRConfig : {} > BCR_CONFIG .BSLConfig : {} > BSL_CONFIG }
我的两个测试项目:
e2e.ti.com/.../MSPM0_2D00_FlashTest.zip
MSPM0L2228的控制台输出:
谢谢、Sal。
我很好奇、您是否同样拥有中断以及您能找到什么。
我很高兴明天收到您的来信
B.R. Timo.
尊敬的 Timo:
我很快就用您之前分享的文件进行测试。
事实证明、以下代码将导致发生异常情况:
我在 line37. 它可以正常工作、而不会有任何问题。
尽管您将0xFF 分配给地址0x20000、它也会将值为0xFF 的 ECC 代码更改为0xFF。 因此、如果不进行擦除操作、就无法对地址进行编程。 为了验证、我还尝试以下代码:
它可以正常工作。
尽管我还不知道 ECC 代码存储在哪里、但我认为您可以在开发应用代码时不会出现 FLASHDED 问题。
如果您 对此有任何进一步的问题、请告诉我。
所以、
B.R.
SAL
尊敬的 Sal:
感谢您的测试。
我想、如果闪存位于0xFF 上、可以写入其他值。 这也适用于写入、值位于闪存中。 但 ECC 似乎是个问题。 我可能同意、由于 ECC、我必须在写入前进行擦除。
但是、让我真正感到奇怪的是、它在 MSPM0G 上不使用擦除即可工作。 API 和 TRM 接缝相同。
你能解释一下吗?
我再次提问的原因是 MSPM0G 的行为符合我的预期。 我的算法就是基于这种设计的。 那么、我感兴趣的是这些器件之间的差异。 我知道 MSPM0L 具有两个存储器组、但这并没有解释不同的行为。
B.R.
Timo
尊敬的 Timo:
我不使用 G3507测试您的代码、因为代码看起来稍有不同、因此请进一步分析 它的低级别逻辑。
以下代码与我在 G3507中进行测试的代码相同、NMI 始终触发。
这是预期行为。
如果您在固件加载后检查 ECC 代码而不开始闪存写入、则可能会发现 ECC 代码已更改。 以下是 G3507数据、L2228应该具有相同的功能。
触发 NMI 后:
我认为、如果闪存打开0xFF、则可以写入其他值。
是的、您可以。 但您忽略了 ECC 代码。 它也是一个闪存区域。 这意味着您不能将"0"写入"1"。 这会发生错误。
我想您应该了解以下内容:
将0xFF 写入闪存也将更改 ECC 代码。 默认 ECC 代码是0xFF、这意味着 相应的闪存是空白、而不是0xFF。
B.R.
SAL
尊敬的 Sal:
再次感谢您的解释。 我想我现在明白了。
在 MSPM0G 上、我可以写入多次、但没有得到中断。 看一下我的屏幕截图。 在这里、我在同一地址从0xFF 开始向下写入。 几次写入后、ECC 代码为0。 我可以将此代码运行至0x00。 而不产生任何中断。 在控制台中、您可以看到循环运行多次。
我将使用 LP-MSPM0G3507的早期样片、并且我认为 ECC 函数已禁用。 否则,我无法解释这一点。 你怎么看?
我当时想 MSPM0G 的行为是正确的、但显然不正确。 这正是让我走错路的原因。
我订购新的 LaunchPad、然后重试。
感谢调查,这是有点困难:)
唯一有待解决的问题是、ECC 值存储在 MSPM0L 中的位置? 这是完全清楚所缺少的。 如果您有任何问题、请告诉我。
非常感谢
Timo
尊敬的 Timo:
您怎么看?
您可以在此处分享您的 LP 的图片、我可以进一步帮助您进行检查。
实际上、预采样 LP 无法使用最新的 SDK、当您将程序加载到器件中时将报告一些警告。
唯一未决问题是、ECC 值存储在 MSPM0L 上的位置? 这是完全清楚所缺少的。 如果您发现任何问题、请告诉我。
是的、我已经与其他团队专家进行了讨论、如果有任何进展、我将在此处进行更新。
B.R.
SAL