cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 4 MCU

Li_Qiang
New Contributor II

最近使用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 Likes
1 Solution
LinglingG_46
Moderator
Moderator

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的标志位都记录下来。我把代码放在附件里面,你看一下,如果有什么疑问,我们再沟通。

View solution in original post

0 Likes
2 Replies
LinglingG_46
Moderator
Moderator

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的标志位都记录下来。我把代码放在附件里面,你看一下,如果有什么疑问,我们再沟通。

View solution in original post

0 Likes
Li_Qiang
New Contributor II

多谢回复,我想是我理解错了,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 Likes