我正在研究STM32F4板。我的IDE是IAR Embedded Work bench。我正在尝试从代码中重置软件。为此,我使用了API'NVIC_SystemReset(); '在'core_cm4.h'标题中定义。但系统重置没有发生。
我在STM32F3中试过同样的东西,同样的IDE。我使用了函数'NVIC_SystemReset(); 'from'core_sc300.h'标题。使用该软件重置正在发生。我发现两个文件中函数的定义是相同的,两个控制器都只是Cortex M4。STM32F4板有什么问题。任何人都可以帮我解决这个问题,或者任何人都可以建议STM32F4中系统复位的替代方法。
请帮忙。提前致谢
您可以使用看门狗:
wdg_activate(n)
以便在n
毫秒内启动系统重置wdg_reactivate()
以将计数器重新加载回n
毫秒void wdg_activate(unsigned short num_of_ms)
{
uint8_t prescale_reg;
uint8_t prescale_val;
if (num_of_ms < 1)
{
num_of_ms = 1;
prescale_reg = IWDG_Prescaler_32;
prescale_val = 1;
}
else if (num_of_ms <= 4096)
{
prescale_reg = IWDG_Prescaler_32;
prescale_val = 1;
}
else if (num_of_ms <= 8192)
{
prescale_reg = IWDG_Prescaler_64;
prescale_val = 2;
}
else if (num_of_ms <= 16384)
{
prescale_reg = IWDG_Prescaler_128;
prescale_val = 4;
}
else if (num_of_ms <= 32768)
{
prescale_reg = IWDG_Prescaler_256;
prescale_val = 8;
}
else
{
num_of_ms = 32768;
prescale_reg = IWDG_Prescaler_256;
prescale_val = 8;
}
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
while (IWDG_GetFlagStatus(IWDG_FLAG_PVU));
IWDG_SetPrescaler(prescale_reg);
while (IWDG_GetFlagStatus(IWDG_FLAG_RVU));
IWDG_SetReload(num_of_ms/prescale_val-1);
IWDG_Enable();
}
void wdg_reactivate()
{
IWDG_ReloadCounter();
}
有几次NVIC_SystemReset()
的迭代。请发布您正在使用的版本的代码。我正在使用的当前[工作STM32F4]版本如下:
/** \brief System Reset
The function initiates a system reset request to reset the MCU.
*/
__STATIC_INLINE void NVIC_SystemReset(void)
{
__DSB(); /* Ensure all outstanding memory accesses included
buffered write are completed before reset */
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */
__DSB(); /* Ensure completion of memory access */
while(1); /* wait until reset */
}