14 votos

STM32: Realizar un restablecimiento de software

Estoy tratando de realizar un restablecimiento de software de mi STM32F2. (Manual de referencia disponible aquí.) La página correspondiente del manual de referencia (página 80) da un poco de información. Básicamente, el SYSRESETREQ poco de la Application Interrupt and Reset Control Register se debe establecer.

Ahora esta página explica que para ser capaz de modificar el SYSRESETREQ, una "clave" debe ser escrito a la VECTKEY bits.

Ni el documento explica donde esta Application Interrupt and Reset Control Register es. ¿Cuál es su dirección, y cómo puedo acceder a él?

23voto

VanOrman Puntos 2149

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

Por otra parte, este es el código tomado de biblioteca CMSIS para Software de reajuste:

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

9voto

Alex Angas Puntos 20408

No obtener suficiente información debido a que usted está buscando en el lugar equivocado. NVIC es una parte del núcleo y, como tal, está documentado en el BRAZO de la literatura.

ARMv7-M BRAZO de la sección B1.5.16 detalles de los dos métodos de restauración disponibles en el Cortex-M3 núcleo, locales y restablecer el sistema. Las direcciones de memoria de sistema de control de registros, incluyendo AIRCR se puede 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 usted puede encontrar el valor exacto de la clave que usted necesita para desbloquear la característica de reinicio.

Sin embargo, como Katte ha señalado, CMSIS contiene una función dedicada a hacer el reset y definiciones de macro para todos los registro de direcciones y los valores requeridos. Usted debe familiarizarse con ella como su código fuente a menudo contiene información difícil de encontrar en cualquier otro (excepto los manuales, por supuesto).

La Guía Definitiva para el ARM Cortex-M3 sección 14.4 documentos de todo esto en una gran cantidad de detalles. Si no lo tienes puedes probar a través de Google Libros para leer (y la esperanza de que las páginas que usted necesita no ser omitido).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X