Khái niệm khởi động STM32F4 và di chuyển bảng vector


8

Có một số điều tôi không hiểu về quy trình khởi động của vi điều khiển STM32F4.

Hiểu biết của tôi là như sau:

  1. Các khởi động ARM Cortex-M4 mong đợi giá trị khởi tạo con trỏ ngăn xếp và các vectơ ngắt được bật 0x00000000 + SCB->VTOR, trong khi SCB->VTORbị xóa khi thiết lập lại.
  2. Không có bộ nhớ tại vị trí đó. Bộ nhớ flash bắt đầu lúc 0x08000000, SRAM tại 0x20000000.
  3. Để có thể khởi động được, có thể ánh xạ đèn flash hoặc phạm vi bộ nhớ SRAM 0x00000000. Phạm vi bộ nhớ được ánh xạ được xác định bởi trạng thái của các chân khởi động.

Những câu hỏi của tôi:

  1. Tại sao hướng dẫn tham khảo STM32F4 nói ở trang 69 rằng

    Khi thiết bị khởi động từ SRAM, trong mã khởi tạo ứng dụng, bạn phải định vị lại bảng vectơ trong SRAM bằng bảng ngoại lệ NVIC và thanh ghi bù.

    ? Theo quan điểm của tôi thì điều này là không cần thiết, vì toàn bộ vùng nhớ được đặt bí danh. Điều thú vị là điều này dường như không được yêu cầu khi vùng flash được ánh xạ vào 0x0không gian.

  2. Việc sử dụng duy nhất để khởi động từ SRAM tôi có thể nghĩ nếu là giảm chu kỳ ghi trên đèn flash trong quá trình phát triển. Trước khi bạn phát hành bản váC từ thiết lập lại, bạn viết chương trình cho SRAM bằng trình gỡ lỗi và sau đó khởi động từ đó. Tuy nhiên, khi bạn có quyền truy cập trình gỡ lỗi, sẽ không có bất kỳ hạn chế nào về việc khởi động từ đâu. Vậy tại sao có tính năng này?

    Vị trí khởi động được lấy từ các chân cho biết (ít nhất là trong ý kiến ​​của tôi) rằng tính năng này sẽ không được sử dụng trong quá trình phát triển mà trong hoạt động cuối cùng. Và trong hoạt động cuối cùng, SRAM rõ ràng tại thời điểm khởi động. Do đó, không có ý nghĩa để khởi động từ SRAM.


Bạn có thể muốn khởi động từ RAM, để thực hiện cập nhật firmware. Mã RAM thực thi và flash lại nội dung của bộ nhớ Flash. Sau khi cập nhật hoàn tất, bạn đặt lại thực thi lại từ Flash.
Fotis Panagiotopoulos

Câu trả lời:


5

Câu hỏi 1:

Tôi chắc chắn không thể trả lời câu hỏi đầu tiên của bạn. Nhưng trong hướng dẫn lập trình nơi thanh ghi VTOR được mô tả ( trang 212 ), nó nói rằng bit 29 được sử dụng để xác định vị trí của bảng vectơ, trong vùng mã (0) hoặc trong vùng SRAM (1).

Bây giờ tôi không hiểu tại sao điều này phải được thực hiện với cùng lý do bạn nêu, SRAM được đặt bí danh là 0x0, vậy tại sao cần phải thiết lập bù này?

Dự đoán duy nhất tôi có được nêu trên trang trích dẫn của bạn 69. Họ nói:

vùng mã bắt đầu từ địa chỉ 0x0000 0000 (được truy cập thông qua các bus ICode / DCode)

vùng dữ liệu (SRAM) bắt đầu từ địa chỉ 0x2000 0000 (được truy cập qua bus hệ thống)

Cortex ® -M4 với CPU FPU luôn tìm nạp vector thiết lập lại trên bus ICode

Có thể trên một ngắt ICode được sử dụng, không thể truy cập SRAM ngay cả khi được ánh xạ lại (tôi không biết điều này có đúng không). Điều này sẽ giải thích tại sao bit này phải được đặt tương ứng, yêu cầu lõi sử dụng bus hệ thống và truy cập SRAM.

Câu hỏi 2:

Mặc dù có thể đúng, SRAM trống trong lần khởi động đầu tiên của thiết bị, nhưng nó không nhất thiết phải là lần khởi động sau. Vì vậy, bạn có thể tạo ra một cái gì đó giống như một thiết bị chạy bằng pin được lập trình SRAM của nó trong quá trình sản xuất và sau đó chạy cho đến khi hết pin, điều này sẽ xóa SRAM của nó. Tôi đoán điều này sẽ làm cho kỹ thuật đảo ngược thiết bị khó hơn một chút.

Trong một thiết bị chạy bằng pin, bạn có thể sẽ sử dụng chế độ chờ để tiết kiệm năng lượng và nếu bạn rời khỏi chế độ đó, các chân Boot được lấy mẫu lại, do đó chúng phải có cài đặt chính xác để quay lại SRAM.

Bạn cũng có thể khởi động lại thiết bị một cách an toàn vì nội dung của SRAM không bị phá hủy nếu không có sự cố mất điện.

Không phải là một ứng dụng rất thuyết phục để khắc phục tất cả các rắc rối để ánh xạ lại SRAM.

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.