STM32 : 소프트웨어 리셋 수행


9

STM32F2의 소프트웨어 재설정을 수행하려고합니다. (참조 가능한 서, 여기 .) 참조 매뉴얼 (80 페이지) 관련 페이지 작은 정보를 제공한다. 기본적으로 SYSRESETREQ비트는 Application Interrupt and Reset Control Register설정되어야합니다.

이제이 페이지 에서는를 수정할 수 있으려면 SYSRESETREQ특정 "키"를 VECTKEY비트에 기록해야한다고 설명합니다 .

어느 문서도 이것이 어디에 있는지 설명하지 않습니다 Application Interrupt and Reset Control Register. 주소는 무엇이며 어떻게 액세스 할 수 있습니까?

답변:


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

9

잘못된 장소를 찾고 있기 때문에 충분한 정보를 찾지 못했습니다. NVIC는 핵심의 일부이므로 ARM 문서에 문서화되어 있습니다.

ARMv7-M ARM 섹션 B1.5.16에서는 Cortex-M3 코어에서 사용할 수있는 두 가지 재설정 방법, 로컬 및 시스템 재설정에 대해 자세히 설명합니다. AIRCR을 포함한 시스템 제어 레지스터의 메모리 주소는 섹션 B3.2.2 (표 B3-4)에서 찾을 수 있습니다. AIRCR 자체는 섹션 B3.2.6에 설명되어 있습니다. 여기서 재설정 기능을 잠금 해제하는 데 필요한 것보다 정확한 키 값을 찾을 수 있습니다.

그러나 Katte가 지적했듯이 CMSIS에는 필요한 모든 레지스터 주소 및 값에 대해 재설정 및 매크로 정의를 수행하는 전용 기능이 모두 포함되어 있습니다. 소스 코드에는 종종 다른 곳에서는 찾기 어려운 정보가 포함되어 있기 때문에 잘 알고 있어야합니다 (물론 설명서는 제외).

ARM Cortex-M3에 대한 최종 안내서 섹션 14.4에이 모든 내용이 자세히 설명되어 있습니다. 이 책이 없으면 Google 도서를 사용하여 읽을 수 있습니다 (필요한 페이지는 생략하지 않기를 바랍니다).


0

누군가 여전히이 질문에 대한 답을 찾고 있다면 CPU의 WatchDog 모듈을 사용하여 장치를 재설정하면 솔루션이 약간 다릅니다.

빠른 팁-다운 카운터가 창 밖으로 다시로드되면 재설정이 시작됩니다 (따라서 재설정은 거의 즉시 가능합니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.