Software initiated reset (SRES) 和 RES_CAUSE register

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

最近使用CY8C4146LQS-S423时碰到一个问题,我想通过寄存器RES_CAUSE来判断重启的原因,所以故意产生WatchDog reset来测试这个功能,但是发现WatchDog发生后如果发生了Software initiated reset (SRES) ,即使再次发生WatchDog也无法通过CySysGetResetReason这个函数读取到WatchDog发生状态,参考“PSoC 4100S - 4100S Plus Architecture TRM.pdf”我知道SRES并不应该产生这种后果,SRES和WatchDog都是重启的原因,可以被同时保存下来,SRES产生我使用的是自动生成的代码CySoftwareReset。

我无法不使用CySoftwareReset,因为我用的是Launcher+ Combination application工程类型,Launcher在切换到Combination application之前会先产生一个software reset,这也是调用的自动生成代码Bootloader_Start 。。。

虽然我已找到原因,CySoftwareReset代码中对CY_SYS_AIRCR_REG的处理是把高16位清零,我只要进行与操作,保留原来高16位已有的值,就不会发生这种问题,有人能告诉我这是为什么吗?

0 点赞
1 解答
lock attach
Attachments are accessible only for community members.
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

1: CM0_AIRCR这个寄存器,也就是你在上面描述的CY_SYS_AIRCR_REG,这个寄存器的高16位是要写成0x05FA的,
void CySoftwareReset(void)
{
/***************************************************************************
* Setting the system reset request bit. The vector key value must be written
* to the register, otherwise the register write is unpredictable.
***************************************************************************/
CY_SYS_AIRCR_REG = (CY_SYS_AIRCR_REG & (uint32)(~CY_SYS_AIRCR_VECTKEY_MASK)) |
CY_SYS_AIRCR_VECTKEY | CY_SYS_AIRCR_SYSRESETREQ;
}

2: 这个高16位清零之后,是和0x05FA0000进行或运算的。

3: 我写了一段测试代码,测试结果是显示可以把watchdog reset和software reset的标志位都记录下来。我把代码放在附件里面,你看一下,如果有什么疑问,我们再沟通。

在原帖中查看解决方案

0 点赞
2 回复数
lock attach
Attachments are accessible only for community members.
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

1: CM0_AIRCR这个寄存器,也就是你在上面描述的CY_SYS_AIRCR_REG,这个寄存器的高16位是要写成0x05FA的,
void CySoftwareReset(void)
{
/***************************************************************************
* Setting the system reset request bit. The vector key value must be written
* to the register, otherwise the register write is unpredictable.
***************************************************************************/
CY_SYS_AIRCR_REG = (CY_SYS_AIRCR_REG & (uint32)(~CY_SYS_AIRCR_VECTKEY_MASK)) |
CY_SYS_AIRCR_VECTKEY | CY_SYS_AIRCR_SYSRESETREQ;
}

2: 这个高16位清零之后,是和0x05FA0000进行或运算的。

3: 我写了一段测试代码,测试结果是显示可以把watchdog reset和software reset的标志位都记录下来。我把代码放在附件里面,你看一下,如果有什么疑问,我们再沟通。

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

多谢回复,我想是我理解错了,CySoftwareReset这个函数没有任何问题,而是我对CySysGetResetReason这个函数的内容没有仔细确认,因为在Software reset和WatchDog reset同时发生时,我只想通过if (CY_SYS_RESET_WDT == CySysGetResetReason(CY_SYS_RESET_WDT))来判断WatchDog reset是否发生,确认过CySysGetResetReason函数的处理后发现这样显然是错误的。

uint32 CySysGetResetReason(uint32 reason)
{
uint32 returnStatus;

reason &= (CY_SYS_RESET_WDT | CY_SYS_RESET_PROTFAULT | CY_SYS_RESET_SW);
returnStatus = CY_SYS_RES_CAUSE_REG &
(CY_SYS_RESET_WDT | CY_SYS_RESET_PROTFAULT | CY_SYS_RESET_SW);
CY_SYS_RES_CAUSE_REG = reason;

return (returnStatus);
}

Software reset和WatchDog reset同时发生时,CySysGetResetReason(CY_SYS_RESET_WDT)得到的是两个reset的与值,我改成了if (CY_SYS_RESET_WDT == (CySysGetResetReason(CY_SYS_RESET_WDT)&&CY_SYS_RESET_WDT))来获取WatchDog reset的值。

但我不太理解参数CY_SYS_RESET_WDT的意义是什么?

0 点赞