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.
如标题所示,在我们当前的项目当中,使用28377d为核心处理器作为控制板控制下面的驱动电路。当我们使用28377d芯片在完全是弱电的环境下工作时(最高电压24v),程序正常运行,不存在问题。而当我们接入负载和驱动电路时(220v通过降压为24v给控制板供电,同时为下方的驱动电路供电),芯片开始出现自动复位的情况,而且非常频繁,之前项目使用的是28335的芯片,从来没有出现过这种问题。一开始我们认为是复位电路太敏感,因此我们拆掉了2个电压监控芯片,改为直接用一个上拉电路加上一个大的电容,在弱电环境下依旧是没有问题的,而上了强电之后,突然复位的情况缺更加明显。我们查找了28377d的数据手册,了解到芯片复位的源如下:
首先程序里是使用InitSysCtrl();函数禁用了看门狗的。那么最可能出现问题的是复位引脚,我们使用示波器去抓取复位引脚突然拉低的过程,但是每次复位的时候都没有抓到复位引脚有拉低的动作,一直保持在3.3v左右,我们也同样观测了内核电压1.2v,也没有什么波动。因此我们目前根本不知道芯片突然复位的源头在哪里,不知道到底是什么原因影响了芯片复位。是否还有什么引起芯片复位的原因?当我们接入驱动电路后应该是会有强电干扰,而我们也在控制板中加入了磁环等来抑制干扰,示波器的观测结果也证明了供电电压和复位引脚并没有什么跳动,希望能有经验丰富的前辈解答疑惑。如果需要一些具体的细节可以在回复中提出,我们会尽力提供。
不是在线运行,是读取您的出现问题的芯片的RESC寄存器。
将出现问题的芯片通过调试器与PC相连,在CCS中,Run --> Debug Configurations..,然后选择load symbol only:
读取一下RESC寄存器的值,确定一下复位源。
读取其实有很多种方式的,也可以通过uniflash来读取。
我今天试过了,如果不给芯片上电的话debug的时候会显示连接不上芯片。但是一上电RESC寄存器又会清零,想求教一下具体操作是怎样的。您看我下面的理解对吗,
1、先让芯片离线运行,运行时遇到异常复位后等到复位完成之后断开电源
2、通过调试器连接到芯片,开始debug读取RESC寄存器
我们现在的问题是如果不给芯片供电的话使用ccs软件无法连接到芯片,期待您的答复
不好意思,我前面的回复确实不太准确。
RESC寄存器在上电之后便会被Bootrom清零,因为要保存之后可能出现的复位信息;但是在清零之前会将信息保存到指定的RAM中(Boot Status Address 0x0000 002C)(spruhm8i_TMS320F2837xD Dual-Core Delfino Microcontrollers Technical Reference Manual (Rev. I) 4.10.11.1 CPU1 Booting Status)。
所以您应该在程序中(我比较推荐在程序的开头部分),读取0x002C的值并将其保存在FLASH中。这样在出现问题后,我们将芯片通过调试器连接,并读取相应内存上的值就能知道复位源。
我要怎么样才能将RAM中的数据写入到片上flash里面呢,我没有找到相关的例程。还有一个问题是芯片异常复位之后,程序重新加载运行(没有掉电上电),RESC寄存器中的值是否会改变?我们通过读取RESC寄存器的值来控制相应的LED灯的开关,但是似乎所有的复位源都没有触发,是否RESC寄存器的值在复位之后不能在程序中直接读取?以下是我们测试用的代码,总之就是利用3个led灯来判断复位源,但所有复位源都试过了也没有led灯点亮。
//判断复位源
if(CpuSysRegs.RESC.bit.XRSn == 1)//外部引脚复位
GPIO_WritePin(70, 1);
if(CpuSysRegs.RESC.bit.WDRSn == 1)//看门狗复位
GPIO_WritePin(90, 1);
if(CpuSysRegs.RESC.bit.NMIWDRSn == 1)//nmi复位
GPIO_WritePin(37, 1);
您如果通过LED来确认的话,请读取Boot Status Address:0x0000 002C的值。有关这个区域的详细说明:spruhm8i_TMS320F2837xD Dual-Core Delfino Microcontrollers Technical Reference Manual (Rev. I) 4.10.11.1 CPU1 Booting Status
我想知道如果芯片出现异常复位能否在软件中通过编程禁止芯片复位呢?还是要在硬件电路上改动,是否有相似的案例可以提供呢?之前有原因搁置了芯片复位的调查,我们最近使用示波器捕获到了芯片内核电压1.2v的电压跳动如下:
请问这种跳动是否正常,芯片会不会因为内核电压走低而掉电复位?我们在弱电环境运行时也捕获到了相似的波形,芯片并不会因此复位,而一旦接入下方的负载芯片就会很快出现复位现象,请问导致芯片复位的最高内核电压是多少呢?我们现在初步认为是负载电路的强电干扰使内核电压走低到了正常工作的阈值而导致芯片复位,还请前辈解答疑惑。
看起来复位就是因为内核电压掉电引起的。VDD的典型值是1.2V,最小值1.14V,最大值1.26V,看您贴出来的图片,电压有从0.7V到1.3V左右的波动,可以推测就是由于供电电压不足导致的掉电复位。
我们也是这样认为的 但是控制板单独运行不接任何驱动的时候是可以正常运行的,正常运行时我们也捕捉到了这样的电压,因此掉电复位好像并不能很好地解释芯片复位的原因。正常工作时我们在Boot Status地址中读取到的数据为:0000 CF00,请问这个数据是否正确,以下是读取RAM区的代码:
#define BOOTSTATUS 0x0000002C
Uint16 *pusCPU01BufferPt;//发送内容指针
Uint32 *BOOTSTAT;
BOOTSTAT = (Uint32 *)BOOTSTATUS;
pusCPU01BufferPt[15] = ((*BOOTSTAT)>>16);//高位
pusCPU01BufferPt[16] = *BOOTSTAT;
还请帮忙看一下代码有没有问题
正常上电复位工作的话Booting Status应该是什么结果?
如果正常工作,boot rom引导完成之后第31位是否应该是1,因为引导已经完成。我们之前使用的读取booting status的代码是否正确?
不好意思回复您晚了。
我们用标准的开发板也测了一下,发现其内核电压也会降到0.8v,但并不影响正常工作
您的LaunchPad上有没有连接什么可能拉低该电压的设备?3.3V的电源是正常的吗?您方便检查一下U4(1.2V LDO)是否有任何损坏迹象?
该电源轨上0.8V的电压是不能完全保证芯片可以正常工作的。
读取RESC方面的问题我还在和相关工程师确认。
#define BOOTSTATUS 0x0000002C
Uint16 *pusCPU01BufferPt;//发送内容指针
Uint32 *BOOTSTAT;
BOOTSTAT = (Uint32 *)BOOTSTATUS;
pusCPU01BufferPt[15] = ((*BOOTSTAT)>>16);//高位
pusCPU01BufferPt[16] = *BOOTSTAT;
您的代码没有问题。就是不是很明白为什么要储存在最后的索引为15、16的数组(指针)中。这可能与您的程序设计有关。您可以在储存到数组(指针)之前先将它赋值给一个变量,来检查读取复位状态信息是否正确。