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?