สิ่งที่ฉันทำ
ฉันกำลังใช้ไมโครคอนโทรลเลอร์ STM32 และสำหรับโครงการของฉันฉันต้องสามารถส่งข้อมูลในเวลาที่กำหนดของวัน (พูดเวลา 11.00 น. และ 14.00 น.) ไมโครคอนโทรลเลอร์จำเป็นต้องรู้ว่าเวลาเท่าไรก่อนที่ฉันจะทำสิ่งนี้สำเร็จ น่าเสียดายที่ฉันมีการสื่อสารทางเดียวเท่านั้นดังนั้นฉันจึงไม่สามารถขอเวลาปัจจุบันจากเครือข่ายได้
ดังนั้นฉันต้องการตั้งเวลาปัจจุบันโดยตรงหลังจากฉันเขียนโปรแกรมเสร็จแล้ว ฉันรู้ว่าฉันสามารถเขียนข้อมูลลงแฟลชได้โดยใช้อินเตอร์เฟสบรรทัดคำสั่งของยูทิลิตี้ ST-LINK (ST-LINK_CLI) โดยใช้คำสั่งต่อไปนี้:
ST-LINK_CLI.exe -w32 <Address> <data> -Rst
ฉันเขียนสคริปต์ทดสอบอย่างง่ายที่เขียนการประทับเวลา Unix ไปยังที่อยู่บางส่วนที่ไม่ได้ใช้งานโดยรหัส
ฉันกำลังจะเขียนฟังก์ชั่นเพื่ออ่านการประทับเวลาและใช้เพื่อตั้งค่าเวลา RTC จนกว่าฉันจะอ่านสิ่งต่อไปนี้ในคู่มือผู้ใช้ยูทิลิตี้ ST-LINK :
-w32 รองรับการเขียนลงในหน่วยความจำแฟลช, OTP, SRAM และ R / W ลงทะเบียน
เมื่อคู่มือบอกว่ารองรับการเขียนลงทะเบียน R / W นี่หมายความว่าฉันสามารถเข้าถึงการลงทะเบียน RTC และตั้งค่าได้โดยตรงหรือไม่ ฉันลองแล้ว แต่ฉันไม่สามารถเขียนถึงรีจิสเตอร์เหล่านี้ได้
ฉันต้องการใช้วิธีนี้หากทำได้เพราะฉันไม่จำเป็นต้องเขียนฟังก์ชันเฉพาะเพื่อจัดการกับไมโครคอนโทรลเลอร์อีกต่อไป ซึ่งหมายความว่าฉันสามารถตั้งค่าเวลา RTC ของไมโครคอนโทรลเลอร์ที่เราใช้อยู่ในปัจจุบันแทนที่จะต้องอัปเดตรหัสของพวกเขา
สิ่งที่ฉันตั้งใจจะทำ
ในการตั้งค่าการลงทะเบียน RTC ฉันพยายามทำตามขั้นตอนต่อไปนี้ตามที่อธิบายไว้ในคู่มืออ้างอิง STM :
- ตั้ง DPB bit ในการลงทะเบียน PWR_CR
- เขียน 0xCA ลงทะเบียน RTC_WPR
- เขียน 0x53 เพื่อลงทะเบียน RTC_WPR
- หยุด RTC โดยการตั้งค่าบิต INIT ในการลงทะเบียน RTC_ISR
- เลือกนาฬิกา 1Hz โดยการเขียนลงทะเบียน RTC_PRER
- โหลดเวลาปัจจุบันโดยการเขียนลงทะเบียน RTC_TR
- โหลดวันที่ปัจจุบันโดยการเขียนลงทะเบียน RTC_DR
- เริ่ม RTC โดยการรีเซ็ตบิต INIT ในการลงทะเบียน RTC_ISR
ในการเข้าถึงการลงทะเบียนฉันได้ใช้ที่อยู่ต่อไปนี้:
- PWR_CR: 0x4000 7000
- RTC_WPR: 0x4000 2824
- RTC_ISR: 0x4000 280C
- RTC_PRER: 0x4000 2810
- RTC_TR: 0x4000 2800
- RTC_DR: 0x4000 2804
เกิดข้อผิดพลาดอะไรขึ้น
ฉันไม่สามารถเขียนลงทะเบียนอย่างใดอย่างหนึ่งเหล่านี้ ด้วย ST-LINK Utility ฉันได้รับข้อความต่อไปนี้:
เกิดข้อผิดพลาดระหว่างการเขียนหน่วยความจำ!
การใช้ ST-LINK_CLI:
กำลังเขียน 0x00000100 ที่ 0x40007000 ... เกิดข้อผิดพลาด!
การอ่านรีจิสเตอร์เหล่านี้ไม่มีปัญหา แต่ฉันไม่สามารถเขียนลงทะเบียนได้โดยใช้ยูทิลิตี้ ST-LINK หรือ Command Line Interface
คำถาม
ฉันจะเขียนลงทะเบียน R / W โดยใช้ยูทิลิตี้ ST-LINK ได้อย่างไร?
มีการป้องกันการเขียนบางประเภทเพื่ออนุญาตให้เขียนลงทะเบียน RTC ที่ฉันมองข้ามไปหรือไม่?