Part Number:TMS320F28335
我的程序分成两部分,一个是bootloader,分配在A扇区,一个是APP部分,分配在H扇区。我的问题是当我将APP擦除后从bootloader跳入APP时,这时候执行的应该是0xff的代码,这应该会触发一个非法指令的中断,但这个中断函数也是分配在被擦除的扇区,我想知道这个时候程序会怎么执行,是陷入死循环还是继续往下执行这个非法指令。而且在此过程中我发现xa12(gpio84)引脚居然会输出一个低电平信号,这个引脚明明是用来指示是否跳入sci_boot的,是个输入引脚,我的整个程序都没有涉及对这个引脚进行配置及其他操作,也没有外部信号驱动他,他是如何变为输出且输出一个低电平的?
Ben Qin:
你好。我查看下相关资料后回复您。
,
Sums:
你好,我后续排查发现是在我升级APP到一半的时候电源掉电会出现这个问题,而且还要是电源慢慢跌落才会出现。后面我初步定位到runtime的boot28.asm中执行到所附代码的第25行时gpio84输出了低电平,因为看不懂汇编,现在没搞明白他是怎么操作到gpio口的,我看这一段应该是初始化变量的代码吧,我猜测是不是因为初始化表格被破坏了导致往GPIO的寄存器乱写数据,但就算他往GPIO的寄存器写0了,寄存器不是还有模式和方向设置吗,不是还有寄存器写保护吗,最后是怎么变成输出低电平的?
**************************************************************************** *PROCESS CINIT INITIALIZATION TABLE.TABLE IS IN PROGRAM MEMORY IN THE* *FOLLOWING FORMAT:* ** *.word<length of init data in words>* *.wordor .long <address of variable to initialize>* *.word<init data>* *.word...* ** *If the variable's address is greater than 65535 (located in 'far'* *memory), then the address field of the cinit record will be 32-bits* *instead of the default 16-bits. The length value is negated to tag* *cinit records for those variables located in far memory.* ** *The init table is terminated with a zero length* ** ****************************************************************************MOVL XAR7,#cinit; point XAR7 at start of tableCLRCTC; reset TC bit used as far flagBSTART, UNC; jump to start processing LOOP:MOVBAH,#0; zero out upper addr bitsPREADAL,*XAR7; load address of variable to be initedADDBXAR7,#1; point to initialization dataB GET_DATA,NTC; get data if variable is not farCLRCTC; reset TC bit used as far flagPREADAH,*XAR7; otherwise, get hi bits of 22-bit addrADDBXAR7,#1 GET_DATA:MOVL XAR6,ACC; addressRPT AR1; repeat length + 1 times || PREAD*XAR6++,*XAR7; copy data from table to memoryMOVL ACC,XAR7; using ACC as temp, point XAR7 toADDACC,AR1; next cinit record since PREADADDB ACC,#1; doesn't change value of XAR7.MOVL XAR7,ACCSTART:PREAD AL,*XAR7; load lengthB GET_ADDR,GEQ; a length < 0 denotes far dataNEGAL; negate value to get real lengthSETCTC; flag that the address field is 32-bits GET_ADDR:MOVZ AR1,AL; copy length value to loop registerADDBXAR7,#1; point to address fieldBANZ LOOP,AR1--; if (length-- != 0) continue
,
Ben Qin:
我咨询下资深工程师后回复您。
,
Sums:
我猜测是为了初始化错误地址的变量,访问到了外部存储器了,所以这时候就不是GPIO功能,而是变成外部存储接口XINTF功能了,所以变成输出,我在XA15,XA14等其他pin上也发现有输出电平变化,而且GPIO的MUX寄存器也不是上电默认的值了。
,
Ben Qin:
Sums 说:我的问题是当我将APP擦除后从bootloader跳入APP时,这时候执行的应该是0xff的代码,这应该会触发一个非法指令的中断
对的
Sums 说:但这个中断函数也是分配在被擦除的扇区
默认情况下 ITRAP ISR是在bootROM中,如果 CPU 尝试执行任何未实现的操作码,这将触发 ITRAP,并且设备将分支到 ROM 中的 ITRAP ISR,这是一个无限循环。如果 WD 尚未禁用,WDCNTR 将溢出并重置设备。您可以在带有空白 Flash 的器件上看到此行为。如果给这样的器件上电,你会看到 -XRS 引脚反复脉冲。
Sums 说:而且在此过程中我发现xa12(gpio84)引脚居然会输出一个低电平信号
在引导模式选择阶段,所有 4 个引脚均为输入引脚。它们只是被阅读,而不是被驱动。
Sums 说:我后续排查发现是在我升级APP到一半的时候电源掉电会出现这个问题,而且还要是电源慢慢跌落才会出现。
这是非常危险的,因为它可能会损坏密码位置并永久锁定设备(使用未知密码)。一旦电源电压降至VMIN以下,器件运行就变得不可预测,这也许可以解释为什么GPIO84可能被视为低电平。