单片机/MCU论坛
直播中

康辅佑

7年用户 940经验值
擅长:控制/MCU
私信 关注

PSoC5有没有办法读取重置的原因并将状态保存到内部EEPROM位置?

我正在做一个基于多微控制器的项目,其中我有两个 PSoC5 微控制器。 当前,当其中一个微控制器出现 WDT 超时时,只会对该芯片进行复位。 我需要执行一个系统级别(两个微控制器),当两个微控制器出现WDT超时时,需要重置。
我遇到过各种帖子,其中提到如果在引导加载程序执行应用程序代码之前读取 CyResetStatus 变量的值,则 CAN 读取此代码。 但是一直以来,我只能得到 CyresetStatus 的值为 0X80 或 0XA0。
有没有办法读取重置的原因并将状态保存到内部EEPROM位置。
有人帮助我解决问题CAN ?

                                                                                                                                                                                                                                                                                                                                                                                                

回帖(2)

谭艳红

2024-1-29 14:54:57
当 CPU 重置时,它会执行它的 Reset () 向量。
几行之后,RESET Status 寄存器(32 位)被读取(然后自动清除),并临时存储在另一个未使用的 32 位寄存器中。
* (reg32 *) (CYREG_PHUB_CFGMEM23_CFG1) = * (reg32 *) (CYREG_RESET_SR0);
然后,如果引导加载程序存在,则运行它。(您已表明它存在于您的项目中。)
在 main () 被调用之前的某个时候,会调用 initialize_psoc (void)。 在这个例程中,CyresetStatus 全局变量使用重置时重置状态寄存器的 LSB 进行设置。 注意:此值暂时存储在 CYREG_PHUB_CFGMEM23_CFG1 中,现在已加载到 cyresetStat us 中。
cyresetStatus = CY_GET_REG8 (CYREG_PHUB_CFGMEM23_CFGMEM23_CFG1);

只要引导加载程序不使用 CYREG_PHUB_CFGMEM23_CFG1,cy resetStatus 就应该反映出重置的原因。
这是另一个观察:你注意到了\"但是我一直只能得到 CyresetStatus 的值为 0X80 或 0XA0。\"   
设置的位是用户可控制的寄存器的 msb 2 位。 这些是应用程序(或引导加载程序) CAN 设置为在软重置中保留的位。
我建议你检查你的引导加载程序,看看它在放弃控制权之前是否修改了 CYREG_PHUB_CFGMEM23_CFG1 寄存器或 Cy resetStatus 变量。
举报

贾大林

2024-1-29 17:35:59
在PSoC5微控制器中,你可以使用CySysGetResetReason()函数来读取重置的原因。该函数返回一个整数,代表了重置原因的位掩码。你可以根据不同的位掩码值来确定重置的原因,例如WDT超时。然后,你可以通过将该值保存到内部EEPROM位置来记录重置的原因。

以下是一个示例代码片段,演示了如何使用CySysGetResetReason()函数读取重置的原因并保存到EEPROM位置:

```c
#include

#define RESET_REASON_ADDR 0x100   // EEPROM地址用于保存重置原因

int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */
   
    /* Read reset reason */
    uint32 resetReason = CySysGetResetReason();
   
    /* Save reset reason to EEPROM */
    CY_EEPROM_Write((uint8 *)&resetReason, RESET_REASON_ADDR, sizeof(resetReason));
   
    for(;;)
    {
        /* Place your application code here. */
    }
}
```

这段代码中,重置原因首先被读取到resetReason变量中。然后,使用CY_EEPROM_Write()函数将resetReason的值写入到EEPROM的RESET_REASON_ADDR地址处。写入完成后,你可以在之后的重置过程中读取该地址的值来获取上次重置的原因。

请注意,保存到EEPROM的值将在芯片断电或复位时保持不变,因此你需要在每次程序重启后重新读取重置原因并决定下一步的操作。

希望对你有帮助!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分