主题中讨论的其他器件:MSPM0G3507
工具与软件:
你好。 我叫 Mori、
我正在检查内部闪存 ROM 的写入、在"DL_FlashCTL_programMemoryFromRAM64WithECCGenerated"处发生硬故障中断。
但是、如果第三个参数的写入数据的存储目标设置为全局变量、
发生 HardFault 中断、但如果我将其设置为局部变量、
否则会发生、并且我能够写入数据。
为什么会发生这种情况?
我已经附上了源代码和执行结果。
请检查。
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.
工具与软件:
你好。 我叫 Mori、
我正在检查内部闪存 ROM 的写入、在"DL_FlashCTL_programMemoryFromRAM64WithECCGenerated"处发生硬故障中断。
但是、如果第三个参数的写入数据的存储目标设置为全局变量、
发生 HardFault 中断、但如果我将其设置为局部变量、
否则会发生、并且我能够写入数据。
为什么会发生这种情况?
我已经附上了源代码和执行结果。
请检查。
你(们)好
我已粘贴文本作为源代码。
我已将图像粘贴为执行结果。
请检查它。
【源码】
#if _debug_flash_WT
static errlog_t stDmyLog;//←全局变量
#endif
#if development_msp430_to_MSPM0
__attribute__((optnone))
int main (void)
#else
void main (void)
#endif
{
#if development_msp430_to_MSPM0
uchar bSysRequest;
uchar bTskRequest;
uchar bCnt;
#if _debug_flash_WT
errlog_t atDmyLog;//←局部变量
uint32_t qDistAddr = 0x00000800;
uint32_t qSize = sizeof (errlog_t);
uint32_t qWrCnt;
uint32_t qWrtAdr;
uint32_t qSctAdr;
Volatile DL_FLASHCTL_COMMAND_STATUS stsCmdStatus;
uint32_t * pqSrc;
barray_fill ((uchar*)&atDmyLog、0xAA、(uchar)sizeof (errlog_t));
pqSrc =(uint32_t*)&atDmyLog;//将数据写入局部变量时←μ s
barray_fill ((uchar*)&stDmyLog、0xAA、(uchar) sizeof (errlog_t));
pqSrc =(uint32_t*)&stDmyLog;//将数据写入全局变量时←μ s
//擦除
qSctAdr = 0x00000800;
CPUSS->CTL &=~CPUSS_CTL_ICACHE_ENABLE;
DL_FlashCTL_unprotectSector (FLASHCTL、qSctAdr、DL_FLASHCTL_REGION_SELECT_MAIN);
stsCmdStatus = DL_FlashCTL_eraseMemoryFromRAM (FLASHCTL、qSctAdr、DL_FLASHCTL_COMMAND_SIZE_SECTOR);
如果(stsCmdStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED)
{
;;;;
}
DL_FlashCTL_waitForCmdDone (FLASHCTL);
CPUSS->CTL |= CPUSS_CTL_ICACHE_ENABLE;
//编程
CPUSS->CTL &=~CPUSS_CTL_ICACHE_ENABLE;
for (qWrtCnt =0;qWrtCnt < qSize;qWrtCnt+=8)
{
qWrtAdr = qDistAddr + qWrtCnt;
DL_FlashCTL_unprotectSector (FLASHCTL、qSctAdr、DL_FLASHCTL_REGION_SELECT_MAIN);
stsCmdStatus = DL_FlashCTL_programMemoryFromRAM64WithECCGenerated (FLASHCTL、qWrtAdr、(uint32_t*) pqSrc);//对写入数据进行寻址(pqSrc)
如果(stsCmdStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED)
{
;;;;
}
PqSrc +=2;
}
CPUSS->CTL |= CPUSS_CTL_ICACHE_ENABLE;
while (1);
#endif
您好!
我已经从我这边验证过。 全局变量和函数内部变量都可支持写入 闪存。
#include "ti_msp_dl_config.h" /* Address in main memory to write to */ #define MAIN_BASE_ADDRESS (0x00000800) /* 32-bit data to write to flash */ //uint32_t gData32 = 0x33333333; volatile DL_FLASHCTL_COMMAND_STATUS gCmdStatus; int main(void) { SYSCFG_DL_init(); uint32_t gData32 = 0x33333333; uint32_t *pqSrc; pqSrc = (uint32_t*)&gData32; /* Unprotect sector in main memory with ECC generated by hardware */ DL_FlashCTL_unprotectSector( FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_REGION_SELECT_MAIN); /* Erase sector in main memory */ gCmdStatus = DL_FlashCTL_eraseMemoryFromRAM( FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_COMMAND_SIZE_SECTOR); DL_FlashCTL_unprotectSector(FLASHCTL, MAIN_BASE_ADDRESS, DL_FLASHCTL_REGION_SELECT_MAIN); gCmdStatus = DL_FlashCTL_programMemoryFromRAM32WithECCGenerated(FLASHCTL, (MAIN_BASE_ADDRESS), (uint32_t*)pqSrc); while(1); }
您能根据我的演示代码再次核对一下吗
此致、
Zoey