公告

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

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

cross mob
zhji_4006061
Level 3
Level 3
25 replies posted 50 sign-ins First solution authored

我用的芯片是psoc6,基于psoc creator4.4,基于CE217633这个示例,在M4 的main函数加入NVIC SystemReset(), 实现系统每隔5秒重新启动,但系统有10%的概率会挂死。添加的代码如下:

int main()
{
UART_START();
printf("reset\r\n\r\n");
Cy_SysLib_Delay(5000);
NVIC_SystemReset();

.....

}

请问 NVIC_SystemReset() 这样用不安全吗? 

0 点赞
1 解答
Owen_Zhang123
Moderator
Moderator
Moderator
5 questions asked 500 solutions authored 250 sign-ins

非常抱歉,最近被其他事情耽搁了。

我这边测试了你的工程,没有看到系统挂死的现象。

请问你那边测试多久会出现问题?

另外,如果用到BLE,需要配置BLE ECO,请在时钟界面使能BLE ECO的配置,并设置相应的参数,否则ECO缺少初始化的配置参数,可能会出错。

 

在原帖中查看解决方案

0 点赞
18 回复数
zhji_4006061
Level 3
Level 3
25 replies posted 50 sign-ins First solution authored

试着在调用NVIC_SystemReset()前关闭中断,问题依然存在

__disable_irq();
NVIC_SystemReset();

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
750 replies posted 250 sign-ins 250 solutions authored

首先请知悉 Calling NVIC_SystemReset from CM4 core it will reset  the CM4 only, Calling NVIC_SystemReset from CM0+ will reset the entire system.

其次 CE217633 中使用了 BLE 功能,其中 BLE Controller 在 CM0p 上运行,BLE Host & Profiles 在 CM4 上运行,两者之间是存在交互的,你这样强制对 CM4 做复位,对 BLE 子系统的正常运行肯定是有影响的,是非法的。

如果你想测试 NVIC_SystemReset() 函数的功能,建议你使用空工程去测试。

 

0 点赞

因为我们产品的BLE功能跟CE217633类似 ,BLE Controller 在 CM0p 上运行,BLE Host & Profiles 在 CM4 上运行,主要的应用程序都跑在M4上,如果在M4直接调用NVIC_SystemReset()是非法,那正确软重启整个系统要怎么操作呢?

1,如果需要在M0调用NVIC_SystemReset,是不是需要M4通过ipc发消息到M0?

2,能不能通过WDT来重启整个系统?

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
750 replies posted 250 sign-ins 250 solutions authored

建议 M4 通过 IPC 发信息给 M0,让 M0 做系统复位

0 点赞

在M4通过WDT重启 也是不行的?

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
750 replies posted 250 sign-ins 250 solutions authored

WDT 确实可以实现 device reset, 但是 WDT 有它自己的用途,系统复位操作还是建议通过 CM0 来完成。

0 点赞

刚才试了WDT,也是会挂死,我再试试IPC

0 点赞
zhji_4006061
Level 3
Level 3
25 replies posted 50 sign-ins First solution authored

刚试了IPC,还是会挂死哦。

M4的代码如下:

int main()
{
UART_START();
printf("reset\r\n\r\n");
Cy_SysLib_Delay(5000);

/* Send the string message to CM0 */
Cy_IPC_Pipe_SendMessage(CY_IPC_EP_CYPIPE_CM0_ADDR,
CY_IPC_EP_CYPIPE_CM4_ADDR,
(void *) &ipcMsgForCM0, 0);

while(1)
{
};

}

M0 的代码如下:

void CM0_MessageCallback(uint32_t *msg)
{
//ipc_msg_t *ipcMsgFromCM4;

if (msg != NULL)
{
NVIC_SystemReset();
}
}

if(Cy_BLE_Start(NULL) == CY_BLE_SUCCESS)
{
Cy_GPIO_Pin_FastInit(led_green_0_PORT,led_green_0_NUM, CY_GPIO_DM_STRONG, 0, HSIOM_SEL_GPIO);
Cy_GPIO_Write(led_green_0_PORT, led_green_0_NUM, 0);


/* Register callback to handle response from CM4 */
Cy_IPC_Pipe_RegisterCallback(CY_IPC_EP_CYPIPE_ADDR,
CM0_MessageCallback,
CY_IPC_EP_CYPIPE_CM4_ADDR);

/* Enable CM4 only if BLE Controller started successfully.
CY_CORTEX_M4_APPL_ADDR must be updated if CM4 memory layout
is changed. */
Cy_SysEnableCM4(CY_CORTEX_M4_APPL_ADDR);
}

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
750 replies posted 250 sign-ins 250 solutions authored

你先试一下在 M0 main.c 中间隔调用 NVIC_SystemReset() 是否会导致系统卡死问题

0 点赞

在M0 的main.c中调用NVIC_SystemReset(),系统也会挂死,代码如下

if(Cy_BLE_Start(NULL) == CY_BLE_SUCCESS)
{
Cy_GPIO_Pin_FastInit(led_green_0_PORT,led_green_0_NUM, CY_GPIO_DM_STRONG, 0, HSIOM_SEL_GPIO);
Cy_GPIO_Write(led_green_0_PORT, led_green_0_NUM, 0);

Cy_SysLib_Delay(2000);
NVIC_SystemReset();

}

0 点赞
lock attach
Attachments are accessible only for community members.
Owen_Zhang123
Moderator
Moderator
Moderator
5 questions asked 500 solutions authored 250 sign-ins

我在IPC pipe的demo上测试了这个API,可以成功的reset系统。请参考附件的工程。

0 点赞

ipc pipe 确实可以成功reset系统,但我的问题是多次reset系统后系统概率性出现halt的问题

0 点赞

现在怀疑是M0 核 Cy_BLE_Start的问题,reset有可能导致Cy_BLE_Start返回错误,导致系统挂死

0 点赞
Owen_Zhang123
Moderator
Moderator
Moderator
5 questions asked 500 solutions authored 250 sign-ins

可以在kit板上复现问题吗?

如果可以在kit板上复现问题,请把你那边的工程分享过来我们  测一下看看。

0 点赞
lock attach
Attachments are accessible only for community members.

这是我的测试工程,主要改了M0的main函数

0 点赞
Owen_Zhang123
Moderator
Moderator
Moderator
5 questions asked 500 solutions authored 250 sign-ins

非常抱歉,最近被其他事情耽搁了。

我这边测试了你的工程,没有看到系统挂死的现象。

请问你那边测试多久会出现问题?

另外,如果用到BLE,需要配置BLE ECO,请在时钟界面使能BLE ECO的配置,并设置相应的参数,否则ECO缺少初始化的配置参数,可能会出错。

 

0 点赞

有时候跑一个小时就挂死了,有时候跑一天也没问题,很随机。

0 点赞
Owen_Zhang123
Moderator
Moderator
Moderator
5 questions asked 500 solutions authored 250 sign-ins

如果你用的是kit board,请按照下面文档40和41页的说明配置ECO时钟,看下问题是否还会复现。如果是自己做的板子,则需要根据板子上的晶振调整ECO的参数。

https://www.infineon.com/dgdl/Infineon-AN210781_Getting_Started_with_PSoC_6_MCU_with_Bluetooth_Low_E...

0 点赞