项目场景:
通过串口传输数据进行信息配置,配置以后需要进行软件复位
问题描述
采用HAL库的HAL_NVIC_SystemReset()软件复位函数不能进行软件复位
查询资料后操作寄存器直接进行软件复位代码如下:
void Sys_Soft_Reset(void)
{
SCB->AIRCR =0X05FA0000|(uint32_t)0x04;
}
通过直接操作寄存器方法进行软件复位并没有解决问题,又采用了关闭所有中断的方法,代码如下:
__set_FAULTMASK(1); //关闭所有中断
HAL_NVIC_SystemReset(); //进行软件复位
采用了关闭所有中断的方法,解决了问题,可以进行软件复位了,但是在继续写程序调试过程中又出现了,软件复位的程序卡住的现象
解决方案:
最后直接修改了复位函数的程序,代码如下:
源代码:
1 __NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
2 {
3 __DSB(); /* Ensure all outstanding memory accesses included
buffered write are completed before reset */
4 SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
5 (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
6 SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */
7 __DSB(); /* Ensure completion of memory access */
8 for(;;) /* wait until reset */
9 {
10 __NOP();
11 }
12 }
修改之后的代码:
1 __NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
2 {
3 __DSB(); /* Ensure all outstanding memory accesses included
buffered write are completed before reset */
4 SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
5 (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
6 SCB_AIRCR_VECTRESET_Msk ); /* Keep priority group unchanged */
7 __DSB(); /* Ensure completion of memory access */
8 for(;;) /* wait until reset */
9 {
10 __NOP();
11 }
12 }
总结:将第6行的SCB_AIRCR_SYSRESETREQ_Msk修改为SCB_AIRCR_VECTRESET_Msk解决问题。