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.
尊敬的各位:
当我尝试将HRPWM,ADC和CLA全部集成在一起时,我遇到了一个非法的ISR,尽管它们似乎占用了PieVectorTable中的不同中断插槽。 在论坛中进行搜索后,我怀疑某个注册表值被指向illegal _ISR例程的值覆盖。 请看一下下面我的代码(摘自主{}例程),因为我无法找出错误的位置。
提前感谢。
Giel Van den Broeck
工具/软件:Code Composer Studio
//// 初始化控制和模拟子系统的系统控制 //启用外设时钟 //此示例函数可在F2837xD_sysctrl.c文件中找到。 // EALLOW;//这是写入EALLOW保护寄存器所必需的 InitSysCtrl(); EDIS; //禁用CPU中断 DINT; //// 初始化GPIO // // PWM InitEPwmGpio(); //设置LED2. GPIO_SetupPinMux (31,GPIO _MUX_CPU1,0); GPIO _SetupPinOptions (31,GPIO输出, GPIO_PushPull); // //将PIE控制寄存器初始化到其默认状态。 //默认状态是禁用所有PIE中断, 并清除标志//。 ////// 此函数位于F2837xD_PIECTRL.c文件中。 // InitPieCtrl();//// 禁用CPU中断并清除所有CPU中断标志: // EALLOW; IER = 0x0000; IFR = 0x0000; //// 使用指向shell Interrupt //服务例程(ISR)的指针初始化PIE矢量表。 //这将填充整个表,即使在此 示例中未使用中断//。 这对于调试非常有用。 // shell ISR例程位于F2837xD_DefaultIsr.C.中 //此函数位于F2837xD_PieVect.C.中 // InitPieVectorTable(); EDIS; // // CLA配置 //首先配置CLA内存空间,然后配置 // CLA任务向量 // CLA_configClaMemory(); CLA_initCpu1Cla1(); //启用中断 EALLOW; PieVectorTable.ADCA1_INT =&adca1_ISR;// ADCA中断1 PieVectorTable.EPWM1_INT =&epwm1_ISR;// EPTM1中断 函数PieVectorTable.CLA1_INT =&clclclclclclava1Isr1;PieVecm1_IN1 = PieVect1 ;表 1 = 1 = 1;表1;表1 = 1;表1;表1 = PieVectorTable.CLA1_6_INT =&cla1Isr6; PieVectorTable.CLA1_7_INT =&cla1Isr7; PieVectorTable.CLA1_8_INT =中断1Isr8; EDIS; //启用全局中断和较高优先级实时调试事件 IER || M_INT1;/INT/INCLA组 IE11/ 启用E11 (ETR1)中断IN_IN11 (EIN_IN14) IN_IN13 (ETRA组) IER) //启用全局中断INTM //ERTM;//启用全局实时中断DBGM //启用PIECtrlRegs.PIEER1.bit.INTx1 = 1; //启用ADCA1中断(请参阅技术参考手册第94页) PieCtrlRegs.PIEIEER3.INTx1 = 1; //启用EPWIEr1.Ctrl/PIE1.IE1 = PIE1.IE1。 //启用CLA中断 //// 初始化系统变量,启用HRPWM // UpdateFine =1; PeriodFine =0; 状态= SFO_INCOMPLETE; //// 启用全局中断和更高优先级的实时调试事件: // EINT;//启用全局中断INTM ERTM; //启用全局实时中断DBGM //// 调用SFA()使用已校准的MEP_ScaleFactor更新HRMSTEP寄存器。 //在启用 //高分辨率期间控制之前,HRMSTEP必须填入比例因子值。 // //while (status == SFO_INCOMPLETE)//呼叫直到完成 //{ //status = SFA(); //IF (状态== SFO_ERROR) //{ //error();//如果发生错误,SFO函数返回2,并且MEP的编号为 //} //步长/粗步长超过最大值255。 //}//// ADC配置 // ADC_Config(); //配置ADC SOC信道 ADCChannels(); //将SOC信道链接到ADCIN信道 //// eCLA和HRPWM寄存器配置 // HRPWM_Config(PWM_Period);// ePWMx目标 EALLOW; // Setuptest //CLA和HRPWM寄存器配置//
我想补充以下信息:
在调试过程中,我发现禁用CLA_configClaMemory功能后问题消失。 但是,我们当然失去了CLA的功能。
void CLA_configClMemore(void) { extern UINT32_t Cla1funcsRunStart, Cla1funcsLoadSize; EALLOW; #ifdef _flash //将代码从闪存复制到RAM memcpy((UINT32_t *)&Cl1MemClemsRunStart; UCM.C1= 正在初始化CMSS1=正在初始化状态/U1CD.CD1.I = //选择LS5RAM作为CLA的编程空间 //首先将CLA配置为主LS5,然后 //将空间设置为程序块 //MemCfgRegs.LSxMSEL.bit.MSEL_LS5 =1; //MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 =1; // //选择LS4和LS5RAM作为CLA的编程空间 //首先将CLA配置为主LS4/LS5,然后 //将空间设置为程序块 // MemCfgRegs.LSxMSEL.Bit.MSEL_LS4 =1;MemCfgRegs.LSxCLAPGM.Bit_LS1.MSCASP_LS1.1= 1.CASP_LS1.1= 1.CASP_LS1.fgf_LS1= //下一步,将LS0RAM和LS1RAM配置为CLA的数据空间 //首先将CLA配置为LS0(1)的主控制器,然后再配置 //将空格设置为代码块 MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1; MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0; MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;MemCfgRegs.LSxCLAPGM.LS0 = 0
尊敬的Whitney:
感谢您的回复。
我尝试评论不同的代码块,以确定何时输入非法中断服务例程,实际上,在评论不同的代码块时,它一直显示在不同的行中。 例如,在行status = SFA()时,出现错误。
我正在从RAM运行代码。
为了确定哪一行准确触发了illegal _ISR,我找到了以下代码:
void ilical_isr (void) //非法操作陷阱 {// 在此处插入ISR代码 //接下来的两行用于调试,仅用于在此处停止处理器 ASM (“ESTOP0”); //以便代码在未处于调试模式 时也停止ASM (“B $,UNC”); //将PC放在此处以继续执行 ASM (“NOP”); }
是否仅在启用CLA功能时才会看到问题?
我浏览了您的代码,问题不是直接向我提出。 您是否介意共享为存在问题的版本生成的.cmd文件和.map文件?
Whitney
尊敬的Whitney:
感谢您指出这一点。 我更改了链接程序cmd文件,以便CLA不再使用LS4程序空间。 也许我需要在将来重新配置链接器文件,以便为CLA保留更多空间,但到目前为止,问题已经解决。
对于遇到类似问题的其他用户,我将包括更新的链接程序文件。
//如果使用 // CLA C编译器 //项目属性-> C2000链接器->高级选项->命令文件 //预处理->--用户必须在项目链接器设置中定义CLA_C 定义 #ifdef CLA_C //定义CLA暂存器区域的大小, CLA编译器将使用该区域的本地符号和临时工 //也会强制引用标记 //暂存器的特殊符号。 CLA_ScratchPad_size = 0x100; --UNDEF_SYM=__CLA_scratchpad_end --UNDEF_SYm=__CLA_scratchpad_start #endif //CLA_C memory { 第0页:/* begin用于“引导至SARAM”引导加载程序模式*/ begin :Origin = 0x0万,length = 0x0.0002万 RAMM0 :原点= 0x0.0122万,长度= 0x0002DE RAMD0 :原点= 0x00B000,长度= 0x0.08万 RAMD1 :原点= 0x00B800,长度= 0x0.08万 RAMLS4 :原点= 0x00A000,长度= 0x0.08万 RAMLS5 :原点= 0x00A800,长度= 0x0.08万 //RAMLS4_LS5 :原点= 0x00A000,长度= 0x0.1万 重置 :Origin = 0x3FFFC0,length = 0x0.0002万 page 1: boot_rsvd :原点= 0x0.0002万,长度= 0x0.012万 /* M0的一部分,引导ROM将使用此堆栈*/ RAMM1 :原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */ RAMLS0 :原点= 0x0.8万,长度= 0x0.08万 RAMLS1 :原点= 0x0.88万,长度= 0x0.08万 RAMLS2 :原点= 0x0.9万,长度= 0x0.08万 RAMLS3 :原点= 0x0.98万,长度= 0x0.08万 RAMGS0 :原点= 0x00C000,长度= 0x0.1万 RAMGS1 :原点= 0x00D000,长度= 0x0.1万 RAMGS2 :原点= 0x00E000,长度= 0x0.1万 RAMGS3 :原点= 0x00F000,长度= 0x0.1万 RAMGS4 :原点= 0x1万,长度= 0x0.1万 RAMGS5 :原点= 0x1.1万,长度= 0x0.1万 RAMGS6 :原点= 0x1.2万,长度= 0x0.1万 RAMGS7 :原点= 0x1.3万,长度= 0x0.1万 RAMGS8 :原点= 0x1.4万,长度= 0x0.1万 RAMGS9 :原点= 0x1.5万,长度= 0x0.1万 RAMGS10 :原点= 0x1.6万,长度= 0x0.1万 RAMGS11 :原点= 0x1.7万,长度= 0x0.1万 RAMGS12 :原点= 0x1.8万,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 * RAMGS13 :原点= 0x1.9万,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 * RAMGS14 :原点= 0x01A000,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 * RAMGS15 :原点= 0x01B000,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 */ Cana_MSG_RAM :原始= 0x4.9万,长度= 0x0.08万 CANB_MSG_RAM :原点= 0x04B000,长度= 0x0.08万 CLA1_MSGRAMLOW:原点= 0x0.148万,长度= 0x0.008万 CLA1_MSGRAMHIGH:原点= 0x0.15万,长度= 0x0.008万 } 节 { codegstart :>开始, 页面= 0 //.text :>> RAMD0|RAMD1|RAMLS4_LS5,页面= 0 .text :>> RAMD0|RAMD1|RAMLS4,page = 0 //.text :>> RAMD0|RAMD1,页面= 0 .cit :> RAMM0, 页面= 0 。Pinit :> RAMM0, 页面= 0 。switch :> RAMM0, 页面= 0 。重置 :>重置, Page =0,type = DSECT /* not used,*/ .stack :> RAMM1, 页面= 1 .ebss :> RAMLS2,页面= 1 。econst :> RAMLS3,第= 1页 。esysmem :> RAMLS3,页=1 Filter_RegsFile:> RAMGS0, 页=1 /* CLA特定章节*//Cla1Prog :> RAMLS4_LS5,Page=0 Cla1Prog :> RAMLS5,页面=0 CLADataLS0 :> RAMLS0,页面=1 CLADataLS1 :> RAMLS1,页面=1 Cla1ToCpuMsgRAM:> CLA1_MSGRAMLS1,页面=1 CpuToMG1MsgRAM:> CLA1_MSGRAMHIGH,页面=1/*过滤器 ,区域= 1文件 : > RAMGS2, 页=1,FILLE=0x2222 Filter3_RegsFile :> RAMGS3, 页=1,FILLE=0x3333 Filter4_RegsFile :> RAMGS4, 页=1,FILLE=0x4444 #ifdef __TI_Compiler_version__ #if __TI_Compiler_version__>= 1500.9万 .ti.ramfunc :{}> RAMM0, 页= 0 #else ramfuncs:> RAMM0 Page =0 #endif #endif #ifdef CLA_C /* CLA C编译器节*//// 必须分配给内存CLA具有对 // CLAskatch的写入访问权限 : {*。obj (CLAskatch) 。 += CLA_ScratchPad_Size; *.obj(CLAScratch_end)}> RAMLS1,页面=1 个.scratchpad :> RAMLS1, 页面= 1 .bss_CLA :> RAMLS1, 页面= 1 .const_CLA :> RAMLS1, 第= 1页 #endif //CLA_C }/* //=================================================== //文件结束。 //=========================================================================================================================================== */