NVIC_SystemReset () не работает для STM32F4

Я работаю над STM32F4 доской. Моя IDE - это встроенный рабочий стол IAR. Я пытаюсь выполнить сброс программного обеспечения из кода. Для этого я использовал API NVIC_SystemReset();, определенный в заголовке core_cm4.h. Но сброса системы не происходит.

Я пробовал то же самое в STM32F3, в той же IDE. Я использовал функцию NVIC_SystemReset(); из заголовка core_sc300.h. С помощью этого программного обеспечения происходит сброс. Я обнаружил, что определения функций в обоих файлах одинаковы, и оба контроллера предназначены только для Cortex M4. В чем проблема с платой STM32F4? Может ли кто-нибудь помочь мне в решении этой проблемы или может ли кто-нибудь предложить альтернативный способ сброса системы в STM32F4.

Пожалуйста помоги. заранее спасибо


person yemans    schedule 04.08.2014    source источник


Ответы (3)


Вместо этого вы можете использовать сторожевую собаку:

  • Вызов 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();
}
person barak manos    schedule 04.08.2014
comment
Привет, Барак, большое спасибо, на самом деле теперь у меня все работает нормально, проблема была такая: несмотря на то, что моя плата STM32F4 сбрасывается, подчиненная плата, подключенная к ней, не сбрасывается за такой небольшой промежуток времени, поэтому я дал небольшую задержку после платы инициализация, и теперь он работает нормально. В любом случае я попробую этот метод WDT, как вы настаиваете. большое спасибо за вашу поддержку - person yemans; 05.08.2014

В HAL вы можете использовать

HAL_NVIC_SystemReset();
person Vladimir    schedule 16.07.2019
comment
Это должен быть принятый ответ. - person tomdertech; 10.03.2021

Было несколько итераций 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 */
}
person bunkerdive    schedule 04.08.2014