STM32: Thực hiện thiết lập lại phần mềm


9

Tôi đang cố gắng thực hiện thiết lập lại phần mềm STM32F2 của mình. (Tài liệu tham khảo có sẵn ở đây .) Trang có liên quan của tài liệu tham khảo (trang 80) cung cấp ít thông tin. Về cơ bản, SYSRESETREQbit của Application Interrupt and Reset Control Registerphải được đặt.

Bây giờ trang này giải thích rằng để có thể sửa đổi SYSRESETREQ, một "khóa" cụ thể cần phải được ghi vào các VECTKEYbit.

Không tài liệu nào giải thích nơi này Application Interrupt and Reset Control Register. Địa chỉ của nó là gì và làm thế nào tôi có thể truy cập nó?

Câu trả lời:


17

Tại sao bạn không sử dụng thư viện CMSIS? Có một chức năng cụ thể cho điều đó.

Hơn nữa, đây là Mã được lấy từ Thư viện CMSIS để thiết lập lại phần mềm hệ thống:

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

Bạn không tìm thấy đủ thông tin vì bạn đang tìm sai chỗ. NVIC là một phần cốt lõi và như vậy được ghi lại trong tài liệu ARM.

ARMv7-M ARM phần B1.5.16 chi tiết hai phương pháp đặt lại có sẵn trong lõi Cortex-M3, thiết lập lại cục bộ và hệ thống. Địa chỉ bộ nhớ của các thanh ghi điều khiển hệ thống bao gồm AIRCR có thể được tìm thấy trong phần B3.2.2 (bảng B3-4). Bản thân AIRCR được ghi lại trong phần B3.2.6. Đây là nơi bạn có thể tìm thấy giá trị chính xác cho khóa hơn mức bạn cần để mở khóa tính năng đặt lại.

Tuy nhiên, như Katte đã lưu ý, CMSIS chứa cả chức năng chuyên dụng để thực hiện đặt lại và định nghĩa macro cho tất cả các địa chỉ đăng ký và giá trị được yêu cầu. Bạn nên làm quen với nó vì mã nguồn của nó thường chứa thông tin khó tìm thấy ở bất kỳ nơi nào khác (ngoại trừ hướng dẫn sử dụng, tất nhiên).

Hướng dẫn dứt khoát cho ARM Cortex-M3 phần 14.4 ghi lại tất cả những điều này rất chi tiết. Nếu bạn không có nó, bạn có thể thử sử dụng Google Sách để đọc nó (và hy vọng rằng các trang bạn cần sẽ không bị bỏ qua).


0

Trong trường hợp ai đó vẫn đang tìm câu trả lời cho câu hỏi này, giải pháp của tôi sẽ khác một chút bằng cách sử dụng mô-đun WatchDog của CPU để đặt lại thiết bị.

Mẹo nhanh - nếu tải xuống được tải lại bên ngoài cửa sổ, nó sẽ kích hoạt thiết lập lại (vì vậy việc thiết lập lại có thể gần như ngay lập tức).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.