STM32: Executando uma redefinição de software

9

Estou tentando executar uma redefinição de software do meu STM32F2. (Manual de referência disponível aqui .) A página relevante do manual de referência (página 80) fornece poucas informações. Basicamente, o SYSRESETREQbit do Application Interrupt and Reset Control Registerdeve ser definido.

Agora, esta página explica que, para poder modificar SYSRESETREQ, uma "chave" específica precisa ser gravada nos VECTKEYbits.

Nenhum documento explica onde Application Interrupt and Reset Control Registeré isso . Qual é o endereço e como posso acessá-lo?

Randomblue
fonte

Respostas:

17

Por que você não usa a biblioteca CMSIS? Existe uma função específica para isso.

Além disso, este é o código retirado da CMSIS Library for System Software Reset:

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

Você não está encontrando informações suficientes porque está procurando um lugar errado. O NVIC faz parte do núcleo e, como tal, está documentado na literatura do ARM.

ARMv7-M A seção B1.5.16 do ARM detalha os dois métodos de redefinição disponíveis no núcleo do Cortex-M3, redefinição local e do sistema. Os endereços de memória dos registros de controle do sistema, incluindo o AIRCR, podem ser encontrados na seção B3.2.2 (tabela B3-4). O próprio AIRCR está documentado na seção B3.2.6. É aqui que você pode encontrar o valor exato da chave para desbloquear o recurso de redefinição.

No entanto, como Katte observou, o CMSIS contém uma função dedicada para fazer as definições de redefinição e macro para todos os endereços e valores de registro necessários. Você deve se familiarizar com ele, pois seu código-fonte geralmente contém informações difíceis de encontrar em qualquer outro lugar (exceto manuais, é claro).

O Guia Definitivo da seção 14.4 do ARM Cortex-M3 documenta tudo isso com muitos detalhes. Se você não o tiver, tente usar o Google Livros para lê-lo (e espere que as páginas necessárias não sejam omitidas).

Espinho
fonte
0

Caso alguém ainda esteja procurando uma resposta para essa pergunta, minha solução seria um pouco diferente usando o módulo WatchDog da CPU para redefinir o dispositivo.

Dica rápida - se o contador descendente for recarregado do lado de fora da janela, ele acionará uma redefinição (para que a redefinição seja quase instantânea).

Shahar Hadas
fonte