1

我在STM32F4船上工作。我的 IDE 是 IAR Embedded Work bench。我正在尝试从代码中进行软件重置。为此,我使用了标题中NVIC_SystemReset();定义的 API '' 。core_cm4.h但是系统重置没有发生。

我在 STM32F3,相同的 IDE 中尝试了同样的事情。我使用了 NVIC_SystemReset();标题core_sc300.h中的功能。正在使用该软件重置。我发现两个文件中的函数定义相同,并且两个控制器都是 Cortex M4。STM32F4 板有什么问题?任何人都可以帮助我解决这个问题,或者任何人都可以建议在STM32F4中进行系统重置的替代方法。

请帮忙。提前致谢

4

3 回答 3

4

在 HAL 中你可以使用

HAL_NVIC_SystemReset();
于 2019-07-16T14:26:54.177 回答
2

您可以改用看门狗:

  • 调用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();
}
于 2014-08-04T15:16:55.047 回答
0

已经有好几次迭代了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 */
}
于 2014-08-04T16:42:48.223 回答