STM32: Durchführen eines Software-Resets

9

Ich versuche, einen Software-Reset meines STM32F2 durchzuführen. (Referenzhandbuch hier verfügbar .) Die entsprechende Seite des Referenzhandbuchs (Seite 80) enthält nur wenige Informationen. Grundsätzlich muss das SYSRESETREQBit von Application Interrupt and Reset Control Registergesetzt werden.

Auf dieser Seite wird nun erklärt, dass zum Ändern SYSRESETREQdes VECTKEYBits ein bestimmter "Schlüssel" in die Bits geschrieben werden muss.

Keines der Dokumente erklärt, wo dies Application Interrupt and Reset Control Registerist. Wie lautet die Adresse und wie kann ich darauf zugreifen?

Zufälliges Blau
quelle

Antworten:

17

Warum verwenden Sie nicht die CMSIS-Bibliothek? Dafür gibt es eine spezielle Funktion.

Darüber hinaus ist dies der Code aus der CMSIS-Bibliothek zum Zurücksetzen der Systemsoftware:

/******************************************************************************
 * @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 */
}
Katte
quelle
9

Sie finden nicht genügend Informationen, weil Sie an einem falschen Ort suchen. NVIC ist ein Teil des Kerns und als solcher in der ARM-Literatur dokumentiert.

ARMv7-M ARM-Abschnitt B1.5.16 beschreibt die beiden im Cortex-M3-Kern verfügbaren Rücksetzmethoden, das lokale Zurücksetzen und das Zurücksetzen des Systems. Speicheradressen von Systemsteuerregistern einschließlich AIRCR finden Sie in Abschnitt B3.2.2 (Tabelle B3-4). Der AIRCR selbst ist in Abschnitt B3.2.6 dokumentiert. Hier finden Sie den genauen Wert für den Schlüssel, den Sie zum Entsperren der Rücksetzfunktion benötigen.

Wie Katte bemerkt hat, enthält CMSIS jedoch sowohl eine spezielle Funktion zum Zurücksetzen als auch Makrodefinitionen für alle erforderlichen Registeradressen und -werte. Sie sollten sich damit vertraut machen, da der Quellcode häufig Informationen enthält, die sonst nirgends zu finden sind (außer natürlich in Handbüchern).

Der endgültige Leitfaden zum ARM Cortex-M3 in Abschnitt 14.4 dokumentiert dies alles sehr detailliert. Wenn Sie es nicht haben, können Sie versuchen, es mit Google Books zu lesen (und hoffen, dass die benötigten Seiten nicht weggelassen werden).

Dorn
quelle
0

Falls jemand noch nach einer Antwort auf diese Frage sucht, wäre meine Lösung etwas anders, wenn das Gerät über das WatchDog-Modul der CPU zurückgesetzt würde.

Schneller Tipp - Wenn der Downcounter außerhalb des Fensters neu geladen wird, wird ein Reset ausgelöst (so dass der Reset fast sofort erfolgen kann).

Shahar Hadas
quelle