STM32: Realizando un reinicio del software

9

Estoy intentando realizar un reinicio del software de mi STM32F2. (El manual de referencia está disponible aquí .) La página correspondiente del manual de referencia (página) 80) da poca información. Básicamente, se debe configurar el bit SYSRESETREQ del Application Interrupt and Reset Control Register .

Ahora esta página explica que Para poder modificar el SYSRESETREQ , se debe escribir una "clave" específica en los bits VECTKEY .

Ningún documento explica dónde está este Application Interrupt and Reset Control Register . ¿Cuál es su dirección y cómo puedo acceder a ella?

    
pregunta Randomblue

3 respuestas

16

¿Por qué no usas la biblioteca CMSIS? Hay una función específica para eso.

Además, este es el código tomado de CMSIS Library para el reinicio del software del sistema:

/******************************************************************************
 * @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 */
}
    
respondido por el Katte
9

No estás encontrando suficiente información porque estás buscando en un lugar equivocado. NVIC es una parte del núcleo y, como tal, está documentado en la literatura de ARM.

ARMv7-M La sección B1.5.16 de ARM detalla los dos métodos de reinicio disponibles en el núcleo Cortex-M3, el reinicio local y del sistema. Las direcciones de memoria de los registros de control del sistema, incluido el AIRCR, se pueden encontrar en la sección B3.2.2 (tabla B3-4). El AIRCR está documentado en la sección B3.2.6. Aquí es donde puede encontrar el valor exacto para la clave del que necesita para desbloquear la función de restablecimiento.

Sin embargo, como Katte ha señalado, CMSIS contiene una función dedicada para realizar el restablecimiento y las definiciones de macro para todas las direcciones de registro y los valores requeridos. Debería familiarizarse con él, ya que su código fuente a menudo contiene información difícil de encontrar en otro lugar (excepto manuales, por supuesto).

La Guía Definitiva de la sección 14.4 de ARM Cortex-M3 documenta todo esto en detalle. Si no lo tiene, intente utilizar Google Books para leerlo (y espere que no se omitan las páginas que necesita).

    
respondido por el Thorn
0

En caso de que alguien aún busque una respuesta a esta pregunta, mi solución sería un poco diferente al usar el módulo WatchDog de la CPU para reiniciar el dispositivo.

Sugerencia rápida: si el contador descendente se vuelve a cargar fuera de la ventana, se activará un restablecimiento (por lo que el restablecimiento puede ser casi instantáneo).

    
respondido por el Shahar Hadas

Lea otras preguntas en las etiquetas