STM32:执行软件复位
电器工程
stm32
重置
2022-01-21 04:37:10
3个回答
为什么不使用 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 */
}
你没有找到足够的信息,因为你找错了地方。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 图书阅读它(并希望您需要的页面不会被遗漏)。
如果有人仍在寻找这个问题的答案,我的解决方案会有所不同,方法是使用 CPU 的 WatchDog 模块来重置设备。
快速提示 - 如果在窗口外重新加载递减计数器,它将触发重置(因此重置几乎可以立即进行)。
其它你可能感兴趣的问题