การใช้ยูทิลิตี้ ST-LINK เพื่อกำหนดค่า RTC เป็นเวลาปัจจุบัน


9

สิ่งที่ฉันทำ

ฉันกำลังใช้ไมโครคอนโทรลเลอร์ 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 ที่ฉันมองข้ามไปหรือไม่?


อาจมีการป้องกันการเขียนเว้นแต่จะมีการป้อนรหัสคีย์
Sparky256

ดีใจที่เห็นว่าคุณคิดออกมามากมายจากคำแนะนำเบื้องต้น โดยทั่วไปคุณควรโพสต์โซลูชันเป็นคำตอบแทนที่จะแก้ไขคำถามและโดยเฉพาะอย่างยิ่งเมื่อคุณดำเนินการด้วยตัวคุณเองมันจะเหมาะสมที่คุณจะยอมรับในที่สุด
Chris Stratton

ฉันไม่ได้คิดอย่างนั้นจริง ๆ ! ฉันรู้สึกว่าฉันควรทำเช่นนั้นแม้ว่าฉันจะชอบให้คุณมีเครดิตบ้างเช่นกัน
Spectre208

อุปกรณ์ของคุณต้องใช้งานได้นานแค่ไหนในการเขียนโปรแกรมและเวลาของวันต้องแม่นยำแค่ไหน? ฉันแค่เป็นห่วงว่าไม่ว่าคุณจะแม่นยำแค่ไหน RTC ในที่สุดมันก็จะเบี่ยงไปเล็กน้อยอย่างน้อยก็ถ้ามันใช้มานานหลายปีและความต้องการด้านเวลาของคุณนั้นเข้มงวด
Timo

มันควรจะทำงานเป็นเวลา 10 ปีในแบตเตอรี่เดียว .. อย่างไรก็ตามรูปแบบเวลาได้รับการแก้ไขเล็กน้อยโดยหมายเลขสุ่มบางอย่างเพื่อป้องกันอุปกรณ์ทั้งหมดจากการส่งข้อมูลทั้งหมดในครั้งเดียว การเลื่อนเวลา RTC จึงไม่ใช่เรื่องใหญ่
Spectre208

คำตอบ:


4

การลงทะเบียนบางอย่างนั้นถูกกฎหมายสำหรับความกว้างการเข้าถึงที่เฉพาะเจาะจง (เช่น -w32 อาจไม่ถูกต้อง) หรืออาจไม่อ่านค่าที่เขียนไว้ซึ่งอาจทำให้เกิดปัญหากับการตรวจสอบ

อาจมีการ จำกัด ลำดับหรือสถานะในการเข้าถึงสิ่งต่าง ๆ

ตัวเลือกที่ควรแก้ไขปัญหาที่เป็นไปได้ส่วนใหญ่คือการสร้างโปรแกรมขนาดเล็กเพื่อทำงานซึ่งจะเชื่อมโยงกับการทำงานใน RAM คุณสามารถแทนที่ข้อมูลลงในไบนารีได้หลังจากหาออฟเซ็ตอัปโหลดเวอร์ชันที่แก้ไขแล้วเรียกใช้ หรือคุณอาจให้โปรแกรมรับค่าจากขอบเขตของแรมนอกส่วนขยายของไฟล์ซึ่งคุณจะตั้งค่าก่อนเรียกใช้ ด้วยการควบคุมอย่างละเอียดยิ่งขึ้นของ stlink คุณสามารถส่งผ่านค่าในการลงทะเบียน CPU แม้ว่าคุณอาจ (?) ต้องการโปรแกรมบรรทัดคำสั่งโอเพนซอร์สสำรองแทนที่จะเป็น ST เพื่อทำเช่นนั้น (รูทีนขนาดเล็กในวิธีการ RAM นี้ แฟลช)


3

ดังนั้นปัญหาอย่างหนึ่งคือ Chris Stratton ชี้ให้เห็น:

ผู้ลงทะเบียนบางคนอาจไม่อ่านค่าที่เขียนซึ่งอาจทำให้เกิดปัญหากับการตรวจสอบ

นี่หมายความว่าการตรวจสอบล้มเหลวทำให้เกิดข้อผิดพลาดในการแสดงแม้ว่าการดำเนินการเขียนจะสำเร็จ

ด้านล่างคือคำตอบที่ฉันได้รับเมื่ออ่านการลงทะเบียน PWR_ISR การตั้งค่าบิต INIT จากนั้นอ่านการลงทะเบียนอีกครั้ง:

0x4000280C: 00000027

กำลังเขียน 0x00000080 ที่ 0x4000280C ... เกิดข้อผิดพลาด!

0x4000280C: 000000A7

การตรวจสอบของยูทิลิตี้ ST-LINK ตรวจสอบว่าค่าที่เขียนไปยังที่อยู่และอ่านจากการจับคู่ที่อยู่ ในกรณีนี้การดำเนินการเขียนสำเร็จแม้ว่าค่าทั้งสองจะไม่ตรงกันเนื่องจากบิต INIT ถูกตั้งค่าแล้ว

ปัญหาอื่นคือฉันไม่สามารถสังเกตเห็นผลของการดำเนินการเขียนได้ ในขณะที่เชื่อมต่อกับไมโครคอนโทรลเลอร์มันจะถูกเก็บไว้ในสถานะรีเซ็ตโดย ST-LINK (เรียกว่า "เชื่อมต่อภายใต้การรีเซ็ต") ฉันต้องใช้ตัวเลือกการเชื่อมต่อ HOTPLUG ซึ่งเชื่อมต่อกับไมโครคอนโทรลเลอร์โดยไม่หยุดหรือรีเซ็ต

ตัวเลือก“ เชื่อมต่อภายใต้การรีเซ็ต” อนุญาตให้เชื่อมต่อกับเป้าหมายก่อนที่จะดำเนินการคำสั่งใด ๆ สิ่งนี้มีประโยชน์ในหลายกรณีเช่นเมื่อเป้าหมายมีรหัสที่ปิดใช้งานพิน JTAG / SWD

ตัวเลือก“ HotPlug” อนุญาตให้เชื่อมต่อกับเป้าหมายโดยไม่หยุดหรือรีเซ็ต สิ่งนี้มีประโยชน์ในการอัพเดตที่อยู่ RAM หรือการลงทะเบียน IP ขณะที่แอปพลิเคชันทำงานอยู่

ไฟล์ชุดทำงานอย่างเต็มที่ตามที่ฉันต้องการ! คำสั่งตอนนี้มีลักษณะดังนี้:

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

1

ฉันคิดว่าสิ่งที่เกิดขึ้นคือหลังจากเขียนการตรวจสอบจะดำเนินการ หากการลงทะเบียนเดียวกันส่งคืนเวลาปัจจุบันในการอ่านแม้ว่าคุณจะประสบความสำเร็จในการอัปเดต RTC ตัวดีบักจะไม่รับรู้ สิ่งนี้มีโอกาสน้อยที่จะอธิบายปัญหาของ power register (เว้นแต่ว่า debugger กำลังเข้าถึง register นั้นอยู่ภายใต้ประทุน) ตรวจสอบค่าการอ่านด้วยตนเอง หากมีปัญหาที่สำคัญกว่านี้การอ่านอาจล้มเหลวด้วย ลองลงทะเบียนอื่น ๆ ในรายการของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.