STM32: Yazılım sıfırlaması yapma


9

STM32F2 cihazımın yazılım sıfırlamasını gerçekleştirmeye çalışıyorum. (Referans kılavuzuna buradan ulaşabilirsiniz .) Referans kılavuzunun ilgili sayfasına (sayfa 80) çok az bilgi verilmektedir. Temel olarak, SYSRESETREQbitin Application Interrupt and Reset Control Registerayarlanması gerekir.

Şimdi bu sayfada , üzerinde değişiklik yapabilmek için bitlere SYSRESETREQbelirli bir "anahtar" yazılması gerektiği açıklanmaktadır VECTKEY.

Her iki belge de bunun nerede Application Interrupt and Reset Control Registerolduğunu açıklamıyor . Adresi nedir ve adrese nasıl erişebilirim?

Yanıtlar:


17

Neden CMSIS kütüphanesini kullanmıyorsunuz? Bunun için belirli bir işlev var.

Ayrıca, Sistem Yazılımı Sıfırlama için CMSIS Kütüphanesi'nden alınan Kod:

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

Yanlış bir yer aradığınız için yeterli bilgi bulamıyorsunuz. NVIC çekirdeğin bir parçasıdır ve bu nedenle ARM literatüründe belgelenmiştir.

ARMv7-M ARM bölümü B1.5.16, Cortex-M3 çekirdeğinde bulunan iki sıfırlama yöntemini, yerel ve sistem sıfırlamasını detaylandırır. AIRCR dahil sistem kontrol kayıtlarının bellek adresleri bölüm B3.2.2'de (tablo B3-4) bulunabilir. AIRCR'nin kendisi bölüm B3.2.6'da belgelenmiştir. Burada, sıfırlama özelliğinin kilidini açmak için ihtiyaç duyduğunuzdan anahtarın tam değerini bulabilirsiniz.

Ancak, Katte'nin belirttiği gibi, CMSIS, tüm kayıt adresleri ve gerekli değerler için sıfırlama ve makro tanımlamaları yapmak için özel bir işlev içerir. Kaynak kodu genellikle başka hiçbir yerde bulmak zor bilgiler (tabii ki kılavuzlar hariç) içerdiğinden, bunu bilmelisiniz.

ARM Cortex-M3 Bölüm 14.4 için Kesin Kılavuz, tüm bunları çok ayrıntılı olarak belgelemektedir. Elinizde yoksa, okumak için Google Kitaplar'ı kullanmayı deneyebilirsiniz (ve ihtiyacınız olan sayfaların atlanmayacağını umabilirsiniz).


0

Birisinin hala bu soruya cevap araması durumunda, cihazı sıfırlamak için CPU'nun WatchDog modülünü kullanarak çözümüm biraz farklı olacaktır.

Hızlı ipucu - downcounter pencerenin dışına yeniden yüklenirse bir sıfırlama tetikler (böylece sıfırlama neredeyse anında olabilir).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.