STM32: Melakukan reset perangkat lunak

9

Saya mencoba melakukan reset perangkat lunak STM32F2 saya. (Manual referensi tersedia di sini .) Halaman yang relevan dari manual referensi (halaman 80) memberikan sedikit informasi. Pada dasarnya, SYSRESETREQbit Application Interrupt and Reset Control Registerharus diatur.

Sekarang halaman ini menjelaskan bahwa untuk dapat memodifikasi SYSRESETREQ, "kunci" spesifik perlu dituliskan ke VECTKEYbit.

Tidak ada dokumen yang menjelaskan di mana ini Application Interrupt and Reset Control Register. Apa alamatnya, dan bagaimana saya bisa mengaksesnya?

Randomblue
sumber

Jawaban:

17

Mengapa Anda tidak menggunakan perpustakaan CMSIS? Ada fungsi spesifik untuk itu.

Selain itu, Ini adalah Kode yang diambil dari Perpustakaan CMSIS untuk Reset Perangkat Lunak Sistem:

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

Anda tidak menemukan informasi yang cukup karena Anda mencari di tempat yang salah. NVIC adalah bagian dari inti dan dengan demikian didokumentasikan dalam literatur ARM.

ARMv7-M Bagian ARM B1.5.16 merinci dua metode reset yang tersedia di core Cortex-M3, lokal dan pengaturan ulang sistem. Alamat memori register kontrol sistem termasuk AIRCR dapat ditemukan di bagian B3.2.2 (tabel B3-4). AIRCR itu sendiri didokumentasikan dalam bagian B3.2.6. Di sinilah Anda dapat menemukan nilai tepat untuk kunci daripada yang Anda butuhkan untuk membuka kunci fitur reset.

Namun, seperti yang dicatat Katte, CMSIS berisi fungsi khusus untuk melakukan reset dan definisi makro untuk semua alamat register dan nilai yang diperlukan. Anda harus mengenalnya karena kode sumbernya sering berisi informasi yang sulit ditemukan di tempat lain (kecuali manual, tentu saja).

Panduan Definitif untuk bagian ARM Cortex-M3 14.4 mendokumentasikan semua ini dengan sangat rinci. Jika Anda belum memilikinya, Anda dapat mencoba menggunakan Buku Google untuk membacanya (dan berharap bahwa halaman yang Anda butuhkan tidak akan dihapus).

Duri
sumber
0

Jika seseorang masih mencari jawaban untuk pertanyaan ini, solusi saya akan sedikit berbeda dengan menggunakan modul WatchDog dari CPU untuk mengatur ulang perangkat.

Kiat cepat - jika downcounter dimuat ulang di luar jendela itu akan memicu reset (sehingga reset dapat hampir instan).

Shahar Hadas
sumber