Sử dụng Tiện ích ST-LINK để định cấu hình RTC cho đến thời điểm hiện tại


9

Những gì tôi đang làm

Tôi đang sử dụng một vi điều khiển STM32 và đối với dự án của tôi, tôi cần có thể gửi dữ liệu vào những thời điểm cụ thể trong ngày (giả sử, lúc 11 giờ sáng và 2 giờ chiều). Bộ vi điều khiển cần biết mấy giờ trước khi tôi có thể đạt được điều này. Thật không may, tôi chỉ có giao tiếp một chiều và do đó tôi không thể yêu cầu thời gian hiện tại từ mạng.

Vì vậy, tôi muốn đặt thời gian hiện tại, ngay sau khi tôi hoàn thành lập trình. Tôi biết rằng tôi có thể ghi dữ liệu vào flash bằng Giao diện dòng lệnh tiện ích ST-LINK (ST-LINK_CLI) bằng lệnh sau:

ST-LINK_CLI.exe -w32 <Address> <data> -Rst

Tôi đã viết một kịch bản thử nghiệm đơn giản viết dấu thời gian Unix đến một số địa chỉ hiện không được sử dụng bởi mã.

Tôi chuẩn bị viết một hàm để đọc dấu thời gian và sử dụng nó để đặt thời gian RTC. Cho đến khi tôi đọc phần sau trong Hướng dẫn sử dụng tiện ích ST-LINK :

-w32 hỗ trợ ghi vào bộ nhớ Flash, các thanh ghi OTP, SRAM và R / W.

Khi hướng dẫn nói rằng nó hỗ trợ ghi vào các thanh ghi R / W, điều này có nghĩa là tôi có thể truy cập trực tiếp vào các thanh ghi RTC và thiết lập chúng? Tôi đã thử, nhưng dường như tôi không thể viết cho những thanh ghi này.

Tôi muốn sử dụng phương pháp này nếu có, vì tôi không cần phải viết một chức năng cụ thể để xử lý nó trên vi điều khiển nữa. Điều này có nghĩa là tôi có thể đặt thời gian RTC của bất kỳ vi điều khiển nào chúng tôi hiện đang sử dụng, thay vì cần cập nhật mã của chúng.


Tôi định làm gì

Để thiết lập các thanh ghi RTC, tôi đã thử thực hiện các bước sau, như được mô tả trong Hướng dẫn tham khảo STM :

  • đặt bit DPB trong thanh ghi PWR_CR
  • ghi 0xCA vào đăng ký RTC_WPR
  • ghi 0x53 vào thanh ghi RTC_WPR
  • dừng RTC bằng cách đặt bit INIT trong thanh ghi RTC_ISR
  • chọn đồng hồ 1Hz bằng cách ghi vào thanh ghi RTC_PRER
  • tải thời gian hiện tại bằng cách ghi vào thanh ghi RTC_TR
  • tải ngày hiện tại bằng cách ghi vào thanh ghi RTC_DR
  • bắt đầu RTC bằng cách đặt lại bit INIT trong thanh ghi RTC_ISR

Để truy cập vào các thanh ghi, tôi đã sử dụng các địa chỉ sau:

  • PWR_CR: 0x4000 7000
  • RTC_WPR: 0x4000 2824
  • RTC_ISR: 0x4000 280C
  • RTC_PRER: 0x4000 2810
  • RTC_TR: 0x4000 2800
  • RTC_DR: 0x4000 2804

Có chuyện gì

Tôi không thể ghi vào một trong hai thanh ghi này. Với Tiện ích ST-LINK, tôi nhận được thông báo sau:

Xảy ra lỗi trong quá trình ghi bộ nhớ!

Sử dụng ST-LINK_CLI:

Viết 0x00000100 tại 0x40007000 ... Lỗi!

Đọc các thanh ghi này không có vấn đề gì, nhưng tôi không thể viết thư cho chúng bằng Tiện ích ST-LINK hoặc Giao diện dòng lệnh của nó.


Câu hỏi

Làm cách nào tôi có thể ghi vào các thanh ghi R / W bằng Tiện ích ST-LINK?

Có một số loại ghi bảo vệ để cho phép ghi vào các thanh ghi RTC mà tôi bỏ qua?


Có thể được bảo vệ chống ghi trừ khi nhập mã khóa.
Sparky256

Vui mừng khi thấy bạn đã tự mình tìm ra rất nhiều từ những gợi ý ban đầu. Nói chung, bạn nên đăng một giải pháp như một câu trả lời thay vì chỉnh sửa cho câu hỏi, và đặc biệt là khi bạn đã theo đuổi nó đến nay, chính bạn sẽ thích hợp để cuối cùng chuyển sự chấp nhận của bạn sang đó.
Chris Stratton

Tôi thực sự đã không nghĩ về nó theo cách đó! Tôi cảm thấy mình vẫn nên làm như vậy, mặc dù tôi cũng thích bạn có một số tín dụng.
Spectre208

Thiết bị của bạn phải chạy trong bao lâu và thời gian trong ngày phải chính xác đến mức nào? Tôi chỉ lo lắng rằng cho dù RTC của bạn có chính xác đến đâu, cuối cùng nó cũng sẽ trôi đi một chút, ít nhất là nếu nó được sử dụng trong nhiều năm và yêu cầu về thời gian của bạn rất nghiêm ngặt.
Timo

Nó được cho là chạy trong 10 năm với một pin duy nhất .. Tuy nhiên, sơ đồ thời gian đã được sửa đổi một chút bởi một số ngẫu nhiên để ngăn tất cả các thiết bị gửi dữ liệu của chúng cùng một lúc. Do đó thời gian trôi RTC là không có vấn đề lớn.
Spectre208

Câu trả lời:


4

Một số thanh ghi chỉ hợp pháp cho độ rộng truy cập cụ thể (nghĩa là -w32 có thể không chính xác) hoặc có thể không đọc lại các giá trị bằng văn bản có thể gây ra sự cố khi xác minh.

Cũng có thể có các hạn chế về trình tự hoặc trạng thái đối với việc truy cập mọi thứ.

Một tùy chọn có thể giải quyết hầu hết các vấn đề có thể hiểu được sẽ là tạo một chương trình nhỏ để thực hiện công việc có liên quan đến chạy trong RAM. Bạn có thể thay thế dữ liệu thành nhị phân của nó sau khi tìm ra phần bù, tải lên phiên bản sửa đổi và chạy nó. Hoặc bạn có thể yêu cầu chương trình lấy các giá trị từ một vùng RAM bên ngoài phạm vi của tệp mà bạn sẽ đặt trước khi chạy. Với sự kiểm soát chi tiết hơn của liên kết, bạn cũng có thể truyền các giá trị trong các thanh ghi CPU, mặc dù bạn có thể (?) Cần chương trình dòng lệnh nguồn mở thay vì ST để thực hiện điều đó (phương thức nhỏ này trong phương thức RAM là cách chương trình đó thực hiện việc ghi để flash)


3

Vì vậy, một trong những vấn đề là, như Chris Stratton đã chỉ ra:

Một số thanh ghi .. có thể không đọc lại các giá trị bằng văn bản có thể gây ra sự cố khi xác minh.

Điều này có nghĩa là việc xác minh thất bại, khiến lỗi hiển thị, mặc dù thao tác ghi thực sự đã thành công.

Dưới đây là phản hồi tôi nhận được khi đọc thanh ghi PWR_ISR, thiết lập bit INIT, sau đó đọc lại thanh ghi:

0x4000280C: 00000027

Viết 0x00000080 ở 0x4000280C ... Lỗi!

0x4000280C: 000000A7

Việc xác minh Tiện ích ST-LINK kiểm tra xem giá trị được ghi vào địa chỉ và đọc từ địa chỉ trùng khớp. Trong trường hợp này, thao tác ghi đã thành công, mặc dù hai giá trị không khớp nhau, vì bit INIT hiện được đặt.

Vấn đề khác là tôi không thể nhận thấy ảnh hưởng của thao tác ghi. Trong khi được kết nối với vi điều khiển, nó được giữ ở trạng thái thiết lập lại bởi ST-LINK (được gọi là "kết nối dưới thiết lập lại"). Tôi cần sử dụng tùy chọn kết nối HOTPLUG, kết nối với vi điều khiển mà không dừng lại hoặc đặt lại.

Kết nối trên mạng dưới tùy chọn thiết lập lại cho phép kết nối với mục tiêu trước khi thực hiện bất kỳ lệnh nào. Điều này hữu ích trong nhiều trường hợp như khi mục tiêu chứa mã vô hiệu hóa các chân JTAG / SWD.

Tùy chọn của Hot Hotugug cho phép kết nối với mục tiêu mà không bị dừng hoặc đặt lại. Điều này rất hữu ích để cập nhật địa chỉ RAM hoặc thanh ghi IP trong khi ứng dụng đang chạy

Các tập tin lô hoạt động đầy đủ như tôi muốn nó! Lệnh bây giờ trông như thế này:

ST-LINK_CLI.exe -c HOTPLUG -w32 <Address> <data> -w32 <Address> <data> ...

1

Tôi nghĩ những gì đang xảy ra là sau khi viết, việc đọc xác minh được thực hiện. Nếu cùng một thanh ghi trả về thời gian hiện tại trong một lần đọc, mặc dù bạn thành công trong việc cập nhật RTC, trình gỡ lỗi sẽ không nhận ra. Điều này ít có khả năng giải thích một vấn đề với thanh ghi nguồn (trừ khi trình gỡ lỗi đang truy cập vào thanh ghi đó quá dưới mui xe). Kiểm tra giá trị đọc bằng tay. Nếu có một vấn đề quan trọng hơn, việc đọc này cũng có thể thất bại. Ngoài ra, hãy thử các thanh ghi khác trong danh sách của bạn.

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.