尊敬的所有人:
我有一个问题,我相信你可以帮助我,而且以前已经回答过了,但我找不到这个解决方案,所以我希望你能帮助我。
简而言之,我的问题(我理解):即使使用了__data20_write_long,我似乎也无法将一个20位地址写入32位寄存器。 此外、生成的汇编代码偏离了第137页编译器指南中显示的代码。 我尝试了建议的汇编器代码、但也不起作用。
有关我的问题的更多详细信息:我想对从 MSP430FR5994上某个地址开始的整个程序代码计算 CRC32 (256KB)。 因此、我想使用 DMA 来处理 CRC32寄存器、所以我想向 DMAxSA 寄存器写入一个拟合起始地址-这是失败的。
__data20_write_long((unsigned long) &DMA3SA, (unsigned long) 0x23fff);
//or this version taken from the compiler guide
__asm(" MOVA #DMA3SA+0, R15\n"
" MOVX.W #3FFFh, 0(R15)\n"
" MOVX.W #2, 2(R15)\n");
两个代码片段都写入 DMA3SA 寄存器、但只填充0x3fff ->、因此只写入16位部分。 系列数据表指出、它可以采用20位地址(在整个程序空间中使用 DMA 的其他方法)。 我使用 TI 编译器20.2.7和21.6.0以及21.6.1试用了它-在所有版本中、只有低16位被写入源寄存器。 我不知道调试器是否可以从寄存器正确读取32位数据、但执行的代码(不能按预期工作-从0x4500开始、而不是从0x3fff 开始)表明寄存器中确实没有高字节。
另一方面、为__data20_write_long 函数创建的代码偏离了编译器指南中编写的代码,因为它仅生成"MOV.W"命令。 由于我的汇编程序知识是不存在的,所以我不知道这是否相关。
希望您能帮我找到解决方案。
祝你一切顺利
托比亚斯
P.S.:在调试模式下、我也不能向寄存器写入正确的值-这是预期的行为吗?