STM32: Effectuer une réinitialisation logicielle

9

J'essaie d'effectuer une réinitialisation logicielle de mon STM32F2. (Manuel de référence disponible ici .) La page correspondante du manuel de référence (page 80) donne peu d'informations. Fondamentalement, le SYSRESETREQbit du Application Interrupt and Reset Control Registerdoit être défini.

Maintenant, cette page explique que pour pouvoir modifier le SYSRESETREQ, une "clé" spécifique doit être écrite dans les VECTKEYbits.

Aucun des deux documents n'explique où cela se Application Interrupt and Reset Control Registertrouve. Quelle est son adresse et comment y accéder?

Randomblue
la source

Réponses:

17

Pourquoi n'utilisez-vous pas la bibliothèque CMSIS? Il y a une fonction spécifique pour cela.

De plus, il s'agit du code extrait de la bibliothèque CMSIS pour la réinitialisation du logiciel système:

/******************************************************************************
 * @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
la source
9

Vous ne trouvez pas suffisamment d'informations parce que vous cherchez au mauvais endroit. NVIC est une partie du noyau et en tant que tel est documenté dans la littérature ARM.

ARMv7-M ARM section B1.5.16 détaille les deux méthodes de réinitialisation disponibles dans le noyau Cortex-M3, réinitialisation locale et système. Les adresses mémoire des registres de contrôle du système, y compris AIRCR, se trouvent dans la section B3.2.2 (tableau B3-4). L'AIRCR lui-même est documenté dans la section B3.2.6. C'est là que vous pouvez trouver la valeur exacte de la clé dont vous avez besoin pour déverrouiller la fonction de réinitialisation.

Cependant, comme Katte l'a noté, CMSIS contient à la fois une fonction dédiée pour effectuer la réinitialisation et les définitions de macro pour toutes les adresses de registre et les valeurs requises. Vous devriez vous familiariser avec lui car son code source contient souvent des informations difficiles à trouver ailleurs (sauf les manuels, bien sûr).

Le guide définitif de la section 14.4 d'ARM Cortex-M3 documente tout cela avec beaucoup de détails. Si vous ne l'avez pas, vous pouvez essayer d'utiliser Google Livres pour le lire (et espérons que les pages dont vous avez besoin ne seront pas omises).

Épine
la source
0

Au cas où quelqu'un chercherait toujours une réponse à cette question, ma solution serait un peu différente en utilisant le module WatchDog du CPU pour réinitialiser l'appareil.

Conseil rapide - si le compteur inférieur est rechargé en dehors de la fenêtre, il déclenchera une réinitialisation (la réinitialisation peut donc être presque instantanée).

Shahar Hadas
la source