STM32: esecuzione di un ripristino del software


9

Sto cercando di eseguire un ripristino del software del mio STM32F2. (Manuale di riferimento disponibile qui .) La relativa pagina del manuale di riferimento (pagina 80) fornisce poche informazioni. Fondamentalmente, il SYSRESETREQbit di Application Interrupt and Reset Control Registerdeve essere impostato.

Ora questa pagina spiega che per poter modificare il SYSRESETREQ, una "chiave" specifica deve essere scritta nei VECTKEYbit.

Nessuno dei due documenti spiega dove Application Interrupt and Reset Control Registersia. Qual è il suo indirizzo e come posso accedervi?

Risposte:


17

Perché non usi la libreria CMSIS? C'è una funzione specifica per quello.

Inoltre, questo è il codice preso dalla libreria CMSIS per il ripristino del software di 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 */
}

9

Non stai trovando abbastanza informazioni perché stai cercando in un posto sbagliato. NVIC fa parte del core e come tale è documentato nella letteratura ARM.

La sezione ARMv7-M ARM B1.5.16 descrive in dettaglio i due metodi di ripristino disponibili nel core Cortex-M3, il ripristino locale e del sistema. Gli indirizzi di memoria dei registri di controllo del sistema incluso AIRCR sono riportati nella sezione B3.2.2 (tabella B3-4). L'AIRCR stesso è documentato nella sezione B3.2.6. Qui è possibile trovare il valore esatto per la chiave di quello che è necessario per sbloccare la funzione di ripristino.

Tuttavia, come ha notato Katte, CMSIS contiene sia una funzione dedicata per eseguire il reset sia le definizioni macro per tutti gli indirizzi di registro e i valori richiesti. Dovresti familiarizzare con esso poiché il suo codice sorgente spesso contiene informazioni difficili da trovare altrove (tranne i manuali, ovviamente).

La Guida definitiva alla sezione 14.4 di ARM Cortex-M3 documenta tutto questo in molti dettagli. Se non lo hai, puoi provare a utilizzare Google Libri per leggerlo (e sperare che le pagine di cui hai bisogno non vengano omesse).


0

Nel caso in cui qualcuno stia ancora cercando una risposta a questa domanda, la mia soluzione sarebbe leggermente diversa utilizzando il modulo WatchDog della CPU per ripristinare il dispositivo.

Suggerimento rapido: se il downcounter viene ricaricato fuori dalla finestra, si attiverà un reset (quindi il reset può essere quasi istantaneo).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.