首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NVIC_SystemReset ()不适用于STM32F4

NVIC_SystemReset ()不适用于STM32F4
EN

Stack Overflow用户
提问于 2014-08-04 22:31:32
回答 3查看 42.2K关注 0票数 1

我在STM32F4板上工作。我的IDE是IAR嵌入式工作台。我正在尝试从代码中进行软件重置。为此,我使用了在core_cm4.h头中定义的‘NVIC_SystemReset();’接口。但是系统重置没有发生。

我在STM32F3中做了同样的事情,同样的集成开发环境。我使用了core_sc300.h头中的函数NVIC_SystemReset();。使用软件重置正在发生。我发现两个文件中的函数定义是相同的,并且两个控制器都是Cortex M4,only.What是STM32F4板的问题。有没有人可以帮我解决这个问题,或者有没有人建议在STM32F4中进行系统重置的替代方法。

请帮帮忙。提前感谢

EN

回答 3

Stack Overflow用户

发布于 2019-07-16 22:26:54

在HAL中,您可以使用

代码语言:javascript
复制
HAL_NVIC_SystemReset();
票数 3
EN

Stack Overflow用户

发布于 2014-08-04 23:16:55

你可以使用一个看门狗来代替:

  • 调用wdg_activate(n),以便在n milliseconds
  • Call n内启动系统重置,以便将计数器重新加载回

代码语言:javascript
复制
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();
}

代码语言:javascript
复制
void wdg_reactivate()
{
    IWDG_ReloadCounter();
}
票数 2
EN

Stack Overflow用户

发布于 2014-08-05 00:42:48

NVIC_SystemReset()已经有过几次迭代。请发布您正在使用的版本的代码。我正在使用的当前工作的STM32F4版本如下:

代码语言:javascript
复制
/** \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 */
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25121107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档