STM32: Выполнение программного сброса

9

Я пытаюсь выполнить программный сброс моего STM32F2. (Справочное руководство доступно здесь .) Соответствующая страница справочного руководства (стр. 80) дает мало информации. По сути, SYSRESETREQбит Application Interrupt and Reset Control Registerдолжен быть установлен.

Теперь эта страница объясняет, что для того, чтобы иметь возможность изменять SYSRESETREQ, необходимо записать определенный «ключ» VECTKEY.

Ни один документ не объясняет, где это Application Interrupt and Reset Control Register. Каков его адрес и как я могу получить к нему доступ?

Randomblue
источник

Ответы:

17

Почему вы не используете библиотеку CMSIS? Для этого есть специальная функция.

Кроме того, этот код взят из библиотеки CMSIS для сброса системного программного обеспечения:

/******************************************************************************
 * @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
источник
9

Вы не нашли достаточно информации, потому что вы ищете не в том месте. NVIC является частью ядра и, как таковой, задокументирован в литературе по ARM.

В разделе ARMv7-M ARM B1.5.16 подробно описаны два метода сброса, доступных в ядре Cortex-M3: локальный и системный сброс. Адреса памяти регистров управления системой, включая AIRCR, можно найти в разделе B3.2.2 (таблица B3-4). Сама AIRCR описана в разделе B3.2.6. Здесь вы можете найти точное значение ключа, чем вам нужно, чтобы разблокировать функцию сброса.

Однако, как отметила Катте, CMSIS содержит как специальную функцию для выполнения сброса, так и макроопределения для всех требуемых адресов регистров и значений. Вам следует ознакомиться с ним, поскольку его исходный код часто содержит информацию, которую трудно найти где-либо еще (кроме руководств, конечно).

Подробное руководство по ARM Cortex-M3, раздел 14.4, подробно описывает все это. Если у вас его нет, вы можете попробовать использовать Google Книги, чтобы прочитать его (и надеяться, что нужные вам страницы не будут опущены).

колючка
источник
0

В случае, если кто-то все еще ищет ответ на этот вопрос, мое решение будет несколько иным, если для сброса устройства использовать модуль WatchDog ЦП.

Подсказка - если перезагрузить downcounter за пределами окна, он вызовет сброс (поэтому сброс может быть почти мгновенным).

Шахар Хадас
источник