STM32: Przeprowadzanie resetowania oprogramowania


9

Próbuję wykonać reset oprogramowania mojego STM32F2. (Podręcznik referencyjny dostępny tutaj .) Odpowiednia strona podręcznika referencyjnego (strona 80) zawiera niewiele informacji. Zasadniczo należy ustawić SYSRESETREQtrochę tego Application Interrupt and Reset Control Register.

Teraz ta strona wyjaśnia, że ​​aby móc modyfikować SYSRESETREQ, do VECTKEYbitów należy zapisać określony „klucz” .

Żaden dokument nie wyjaśnia, gdzie to Application Interrupt and Reset Control Registerjest. Jaki jest jego adres i jak mogę uzyskać do niego dostęp?

Odpowiedzi:


17

Dlaczego nie korzystasz z biblioteki CMSIS? Jest do tego specjalna funkcja.

Ponadto jest to kod pobrany z biblioteki CMSIS do resetowania oprogramowania systemowego:

/******************************************************************************
 * @file:    core_cm3.h
 * @purpose: CMSIS Cortex-M3 Core Peripheral Access Layer Header File
 * @version: V1.20
 * @date:    22. May 2009
 *----------------------------------------------------------------------------
 *
 * Copyright (C) 2009 ARM Limited. All rights reserved.
 *
 * ARM Limited (ARM) is supplying this software for use with Cortex-Mx 
 * processor based microcontrollers.  This file can be freely distributed 
 * within development tools that are supporting such ARM based processors. 
 *
 * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
 *
 ******************************************************************************/

/* memory mapping struct for System Control Block */
typedef struct
{
  __I  uint32_t CPUID;                        /*!< CPU ID Base Register                                     */
  __IO uint32_t ICSR;                         /*!< Interrupt Control State Register                         */
  __IO uint32_t VTOR;                         /*!< Vector Table Offset Register                             */
  __IO uint32_t AIRCR;                        /*!< Application Interrupt / Reset Control Register           */
  __IO uint32_t SCR;                          /*!< System Control Register                                  */
  __IO uint32_t CCR;                          /*!< Configuration Control Register                           */
  __IO uint8_t  SHP[12];                      /*!< System Handlers Priority Registers (4-7, 8-11, 12-15)    */
  __IO uint32_t SHCSR;                        /*!< System Handler Control and State Register                */
  __IO uint32_t CFSR;                         /*!< Configurable Fault Status Register                       */
  __IO uint32_t HFSR;                         /*!< Hard Fault Status Register                                       */
  __IO uint32_t DFSR;                         /*!< Debug Fault Status Register                                          */
  __IO uint32_t MMFAR;                        /*!< Mem Manage Address Register                                  */
  __IO uint32_t BFAR;                         /*!< Bus Fault Address Register                                   */
  __IO uint32_t AFSR;                         /*!< Auxiliary Fault Status Register                              */
  __I  uint32_t PFR[2];                       /*!< Processor Feature Register                               */
  __I  uint32_t DFR;                          /*!< Debug Feature Register                                   */
  __I  uint32_t ADR;                          /*!< Auxiliary Feature Register                               */
  __I  uint32_t MMFR[4];                      /*!< Memory Model Feature Register                            */
  __I  uint32_t ISAR[5];                      /*!< ISA Feature Register                                     */
} SCB_Type;

#define SCS_BASE            (0xE000E000)                              /*!< System Control Space Base Address    */
#define SCB_BASE            (SCS_BASE +  0x0D00)                      /*!< System Control Block Base Address    */
#define SCB                 ((SCB_Type *)           SCB_BASE)         /*!< SCB configuration struct             */

#define NVIC_AIRCR_VECTKEY    (0x5FA << 16)   /*!< AIRCR Key for write access   */
#define NVIC_SYSRESETREQ            2         /*!< System Reset Request         */

/* ##################################    Reset function  ############################################ */
/**
 * @brief  Initiate a system reset request.
 *
 * @param   none
 * @return  none
 *
 * Initialize a system reset request to reset the MCU
 */
static __INLINE void NVIC_SystemReset(void)
{
  SCB->AIRCR  = (NVIC_AIRCR_VECTKEY | (SCB->AIRCR & (0x700)) | (1<<NVIC_SYSRESETREQ)); /* Keep priority group unchanged */
  __DSB();                                                                                 /* Ensure completion of memory access */              
  while(1);                                                                                /* wait until reset */
}

9

Nie znajdziesz wystarczającej ilości informacji, ponieważ szukasz w złym miejscu. NVIC jest częścią rdzenia i jako taki jest udokumentowany w literaturze ARM.

ARMv7-M ARM sekcja B1.5.16 szczegółowo opisuje dwie metody resetowania dostępne w rdzeniu Cortex-M3, resecie lokalnym i resecie systemu. Adresy pamięci rejestrów kontrolnych systemu, w tym AIRCR, można znaleźć w sekcji B3.2.2 (tabela B3-4). Sam AIRCR jest udokumentowany w sekcji B3.2.6. Tutaj możesz znaleźć dokładną wartość klucza, niż potrzebujesz, aby odblokować funkcję resetowania.

Jednak, jak zauważyła Katte, CMSIS zawiera zarówno dedykowaną funkcję do resetowania, jak i definicje makr dla wszystkich wymaganych adresów rejestrów i wartości. Powinieneś się z nim zapoznać, ponieważ jego kod źródłowy często zawiera informacje trudne do znalezienia w innym miejscu (oczywiście oprócz instrukcji).

Ostateczny przewodnik po ARM Cortex-M3 sekcja 14.4 dokumentuje to wszystko bardzo szczegółowo. Jeśli go nie masz, możesz spróbować użyć Książek Google do jego przeczytania (i mam nadzieję, że potrzebne strony nie zostaną pominięte).


0

W przypadku, gdyby ktoś nadal szukał odpowiedzi na to pytanie, moje rozwiązanie wyglądałoby nieco inaczej, wykorzystując moduł WatchDog procesora do zresetowania urządzenia.

Szybka wskazówka - jeśli downcounter zostanie ponownie załadowany poza okno, nastąpi reset (więc reset może być prawie natychmiastowy).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.