您好!
我正在为协奏曲器件实施 ECC 自检例程。 我按照数据表中的详细说明操作、但在进入中断"单个闪存错误"时遇到问题。 在分步调试中、即使在启用 ECC 测试模式时 PIEFR12被正确设置为2、程序也永远不会进入 ISR。 代码执行一直停留在无条件循环中。 请参阅随附的代码并提出建议。
#pragma DATA_SECTION (gFlashAECCTest、"FlashAECCTestFile");
uint32_t gFlashAECCTest;
#pragma DATA_SECTION (gFlashBECCTest、"FlashBECCTestFile");
uint32_t gFlashBECTEST;
systemControlError_t testFlashECCLogic (const uint32_t * address、const eccFlashTestType_t testType){
CHAR ECC;
/*第5.3.10.3节中详述的准则*/
EALLOW;
ECC = Fapi_calculateEcc ((uint32_t)(address)<< 1、(uint64) 0x0000000000000000);
FlashEccRegs.ERR_THRESHOLD.bit.ERR_THRESHOLD = 1;/*不能为0 -请参阅器件勘误表*/
FlashEccRegs.FADDR_TEST.bit.ADDR =(testType = test_address_single_bit)? (uint32_t)(address)^ 0x1:(uint32_t)(address);
FlashEccRegs.FDATAH_TEST =(testType = TEST_DATA_SINGLE_BIT)? 0x00000001:0x00000000;
FlashEccRegs.FDATAL_TEST =(testType = TEST_DATAL_SINGLE_BIT)? 0x00000001:0x00000000;
FlashEccRegs.fecc_test.bit.ecc =(testType = test_ecc_single_bit)? ECC ^ 0x1:ECC;
FlashEccRegs.FECC_CTRL.bit.ECC_SELECT =(testType = test_DATA_Single_bit)? 0:1;
FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 1;
EDIS;
asm (" NOP");
EALLOW;
FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 0;
FlashEccRegs.ERR_CNT.bit.ERR_CNT = 0;
EDIS;
返回 SYS_CTL_NO_ERROR;
}
systemControlError_t testFlashBank (const uint32_t *地址){
systemControlError_t ret;
if ((ret = testFlashECCLogic (address、test_address_single_bit))< 0) return;
if ((ret = testFlashECCLogic (address、test_DATA_Single_bit))< 0) return;
if ((ret = testFlashECCLogic (address、test_DATA_single_bit))< 0) return;
if ((ret = testFlashECCLogic (address、test_ecc_single_bit))< 0) return;
返回 SYS_CTL_NO_ERROR;
}
systemControlError_t flashSelfTest (void){
systemControlError_t ret;
enableFlashECC();
if ((ret = testFlashBank (&gFlashAECCTest))< 0) return;
if ((ret = testFlashBank (&gFlashBECCTest))< 0) return;
返回 SYS_CTL_NO_ERROR;
}
systemControlError_t 初始化 ECC (void){
systemControlError_t 错误;
/*直接中断信号到 ISR */
EALLOW;
PieVectTable.CFLSINGERR =&flashSingleError;
PieVectTable.CRAMSINGERR =斜升错误(ramSingleError);
EDIS;
//启用 PIE
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
PieCtrlRegs.PIEIER12.bit.INTx2 = 1; //启用 PIE 组12 INT2 (闪存单个错误)
PieCtrlRegs.PIEIER12.bit.INTx4 = 1; //启用 PIE 组12 INT4 (RAM 单错误)
PieCtrlRegs.PIEACK.all = M_INT12;//启用 PIE 中的嵌套
asm (" NOP");//等待 PIEACK 退出流水线参考 使用说明勘误表 SPRZ272H
IER |= M_INT12;
//启用全局中断和更高优先级的实时调试事件:
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM
//首先,我们验证 ECC 模块“SECDED”是否正常工作
//我们将 RAM 置于测试模式并注入一些错误...
// if ((err = RAMECCSelfTest ()< 0){
// DINT; //禁用全局中断 INTM
// DRTM; //禁用全局实时中断 DBGM
// 返回错误;
//}
if ((err = flashSelfTest())<0){
DINT; //禁用全局中断 INTM
DRTM; //禁用全局实时中断 DBGM
退货错误;
}
DINT; //禁用全局中断 INTM
DRTM; //禁用全局实时中断 DBGM
返回 SYS_CTL_NO_ERROR;
}
中断空 flashSingleError (void){
EALLOW;
gFlashECCSingleErrorAddress = FlashEccRegs.Single_ERR_ADDR;
gFlashECrorStatus = FlashEccRegs.ERR_STATUS.all;
gFlashECrrorPositionReg = FlashEccRegs.ERR_POS.ALL;
gFlashCorrectedErrorCounter++;
FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 0;
EDIS;
}
我的 cmd 文件:
FlashAECCTestFile :> FLASHA、 PAGE = 0、 ALIGN (4)
FlashBECCTestFile :> FLASHB、 PAGE = 0、 ALIGN (4)










