STM32: ทำการรีเซ็ตซอฟต์แวร์


9

ฉันพยายามทำการรีเซ็ตซอฟต์แวร์ของ STM32F2 ของฉัน (มีคู่มืออ้างอิงอยู่ที่นี่ ) หน้าที่เกี่ยวข้องของคู่มืออ้างอิง (หน้า 80) ให้ข้อมูลเล็กน้อย โดยทั่วไปSYSRESETREQบิตของApplication Interrupt and Reset Control Registerต้องถูกตั้งค่า

ตอนนี้หน้านี้อธิบายว่าเพื่อให้สามารถปรับเปลี่ยนได้ต้องSYSRESETREQมีการ "เขียน" คีย์เฉพาะลงในVECTKEYบิต

ไม่มีเอกสารอธิบายว่านี่Application Interrupt and Reset Control Registerคือที่ใด ที่อยู่ของมันคืออะไรและฉันจะเข้าถึงมันได้อย่างไร

คำตอบ:


17

ทำไมคุณไม่ใช้ไลบรารี CMSIS มีฟังก์ชั่นเฉพาะสำหรับสิ่งนั้น

นอกจากนี้นี่คือรหัสที่นำมาจาก CMSIS Library สำหรับการรีเซ็ตซอฟต์แวร์ระบบ:

/******************************************************************************
 * @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 core, local และ system reset ที่อยู่หน่วยความจำของการลงทะเบียนการควบคุมระบบรวมถึง AIRCR สามารถดูได้ในหัวข้อ B3.2.2 (ตาราง B3-4) AIRCR นั้นมีการจัดทำเป็นเอกสารไว้ในหัวข้อ B3.2.6 นี่คือที่ที่คุณสามารถค้นหาค่าที่แน่นอนสำหรับคีย์มากกว่าที่คุณต้องการปลดล็อกคุณสมบัติรีเซ็ต

อย่างไรก็ตามตามที่ Katte ได้ระบุไว้ CMSIS มีทั้งฟังก์ชั่นเฉพาะเพื่อทำการรีเซ็ตและนิยามแมโครสำหรับที่อยู่การลงทะเบียนและค่าทั้งหมดที่จำเป็น คุณควรทำความคุ้นเคยกับมันเนื่องจากซอร์สโค้ดมักมีข้อมูลที่หาได้ยากทุกที่ (ยกเว้นคู่มือแน่นอน)

คู่มือการแตกหักของ ARM Cortex-M3 ส่วน 14.4 เอกสารทั้งหมดนี้มีรายละเอียดมากมาย หากคุณไม่มีคุณสามารถลองใช้ Google หนังสือเพื่ออ่าน (และหวังว่าหน้าเว็บที่คุณต้องการจะไม่ถูกมองข้าม)


0

ในกรณีที่บางคนยังมองหาคำตอบสำหรับคำถามนี้โซลูชันของฉันจะแตกต่างกันเล็กน้อยโดยใช้โมดูล WatchDog ของ CPU เพื่อรีเซ็ตอุปกรณ์

เคล็ดลับอย่างรวดเร็ว - หาก downcounter โหลดใหม่นอกหน้าต่างมันจะทริกเกอร์การตั้งค่าใหม่ (เพื่อให้การรีเซ็ตสามารถเกือบทันที)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.