ST-LINK 유틸리티를 사용하여 RTC를 현재 시간으로 구성


9

내가하고있는 일

STM32 마이크로 컨트롤러를 사용하고 있으며 프로젝트의 특정 시간 (예 : 오전 11시와 오후 2시)에 데이터를 보낼 수 있어야합니다. 마이크로 컨트롤러는 이것을 달성하기 전에 몇 시인 지 알아야합니다. 불행히도, 나는 단방향 통신 만하기 때문에 네트워크에서 현재 시간을 요청할 수 없습니다.

따라서 프로그래밍을 마친 직후에 현재 시간을 설정하고 싶습니다. 다음 명령을 사용하여 ST-LINK Utility Command Line Interface (ST-LINK_CLI)를 사용하여 플래시에 데이터를 쓸 수 있다는 것을 알고있었습니다.

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

현재 코드에서 사용하지 않는 주소에 유닉스 타임 스탬프를 쓰는 간단한 테스트 스크립트를 작성했습니다.

타임 스탬프를 읽고 RTC 시간을 설정하는 데 사용하는 함수를 작성하려고했습니다. ST-LINK 유틸리티 사용자 매뉴얼 에서 다음을 읽을 때까지 :

-w32는 플래시 메모리, OTP, SRAM 및 R / W 레지스터 쓰기를 지원합니다.

매뉴얼에 R / W 레지스터 쓰기를 지원한다고 말하면 RTC 레지스터에 직접 액세스하여 설정할 수 있습니까? 시도했지만이 레지스터에 쓰지 못하는 것 같습니다.

더 이상 마이크로 컨트롤러에서 처리하기 위해 특정 함수를 작성할 필요가 없으므로이 방법을 사용하는 것이 좋습니다. 즉, 코드를 업데이트 할 필요없이 현재 사용중인 모든 마이크로 컨트롤러의 RTC 시간을 설정할 수 있습니다.


내가 의도 한 것

RTC 레지스터를 설정하기 위해 STM Reference Manual에 설명 된대로 다음 단계를 수행했습니다 .

  • PWR_CR 레지스터에서 DPB 비트 설정
  • RTC_WPR 레지스터에 0xCA 쓰기
  • RTC_WPR 레지스터에 0x53 쓰기
  • RTC_ISR 레지스터에서 INIT 비트를 설정하여 RTC 중지
  • RTC_PRER 레지스터에 기록하여 1Hz 클록을 선택하십시오
  • RTC_TR 레지스터에 기록하여 현재 시간을로드
  • RTC_DR 레지스터에 기록하여 현재 날짜를로드
  • RTC_ISR 레지스터에서 INIT 비트를 재설정하여 RTC를 시작하십시오.

레지스터에 액세스하기 위해 다음 주소를 사용했습니다.

  • 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 유틸리티를 사용하면 다음 메시지가 나타납니다.

메모리 쓰기 중 오류가 발생했습니다!

ST-LINK_CLI 사용 :

0x40007000에서 0x00000100을 쓰는 중 ... 오류!

이 레지스터를 읽는 것은 문제가되지 않지만 ST-LINK 유틸리티 또는 명령 행 인터페이스를 사용하여 쓸 수는 없습니다.


질문

ST-LINK 유틸리티를 사용하여 R / W 레지스터에 쓰려면 어떻게해야합니까?

내가 간과 한 RTC 레지스터에 쓸 수있는 쓰기 방지 기능이 있습니까?


키 코드를 입력하지 않으면 쓰기 금지되어있을 수 있습니다.
Sparky256

초기 힌트에서 많은 것을 알아 냈습니다. 일반적으로 질문에 대한 편집이 아닌 답변으로 솔루션을 게시해야하며, 특히 지금까지 직접 답을 찾은 경우 최종적으로 수락을 옮기는 것이 좋습니다.
Chris Stratton

나는 실제로 그런 식으로 생각하지 않았습니다! 나는 당신이 약간의 크레딧을 갖기를 원하지만 여전히 그렇게해야한다고 생각합니다.
Spectre208

프로그래밍 후 장치를 얼마나 오래 실행해야합니까, 시간은 얼마나 정확해야합니까? RTC가 아무리 정확하더라도 적어도 몇 년 동안 사용되어 타이밍 요구 사항이 엄격하다면 결국 조금 드리프트 될 것입니다.
Timo

단일 배터리로 10 년 동안 작동해야합니다. 그러나 시간 체계는 모든 장치가 한 번에 데이터를 모두 전송하지 못하도록 임의의 숫자로 약간 수정되었습니다. RTC 타임 드리프트는 그리 중요하지 않습니다.
Spectre208

답변:


4

일부 레지스터는 특정 액세스 너비에 대해서만 유효하거나 (-w32가 올바르지 않을 수 있음) 검증 된 문제를 일으킬 수있는 기록 된 값을 읽지 못할 수 있습니다.

사물 액세스에 대한 순서 또는 상태 제한이있을 수도 있습니다.

생각할 수있는 대부분의 문제를 해결하는 옵션은 RAM에서 실행되도록 링크 된 작업을 수행하는 작은 프로그램을 만드는 것입니다. 오프셋을 알아 낸 후 데이터를 이진으로 대체하고 수정 된 버전을 업로드 한 후 실행할 수 있습니다. 또는 프로그램이 파일 범위 밖의 RAM 영역에서 값을 가져 오도록 할 수 있습니다. stlink에 대한 세밀한 제어를 통해 CPU 레지스터에 값을 전달할 수도 있지만 ST가 아닌 대체 오픈 소스 명령 행 프로그램이 필요할 수 있지만 (RAM 방법의 작은 루틴은 우연히 해당 프로그램이 쓰기를 수행하는 방법입니다. 플래시)


3

Chris Stratton이 지적했듯이 문제 중 하나는 다음과 같습니다.

일부 레지스터는 확인에 문제를 일으킬 수있는 기록 된 값을 읽지 못할 수 있습니다.

즉, 실제로는 쓰기 작업이 성공했지만 확인에 실패하여 오류가 표시됩니다.

다음은 PWR_ISR 레지스터를 읽고 INIT 비트를 설정 한 다음 레지스터를 다시 읽을 때 얻는 응답입니다.

0x4000280C : 00000027

0x4000280C에서 0x00000080 쓰기 중 ... 오류!

0x4000280C : 000000A7

ST-LINK 유틸리티의 검증은 주소에 쓰여지고 주소에서 읽은 값이 일치하는지 확인합니다. 이 경우 INIT 비트가 설정되었으므로 두 값이 일치하지 않더라도 쓰기 작업이 성공한 것입니다.

다른 문제는 쓰기 작업의 효과를 알 수 없다는 것입니다. 마이크로 컨트롤러에 연결된 동안 ST-LINK ( "재설정 상태의 연결")에 의해 재설정 상태로 유지됩니다. HOTPLUG 연결 옵션을 사용해야하는데, 중단이나 재설정없이 마이크로 컨트롤러에 연결합니다.

“reset under reset”옵션을 사용하면 명령을 실행하기 전에 대상에 연결할 수 있습니다. 이는 대상에 JTAG / SWD 핀을 비활성화하는 코드가 포함 된 경우와 같이 많은 경우에 유용합니다.

"HotPlug"옵션을 사용하면 정지하거나 재설정하지 않고 대상에 연결할 수 있습니다. 응용 프로그램이 실행되는 동안 RAM 주소 또는 IP 레지스터를 업데이트하는 데 유용합니다

배치 파일은 내가 원하는대로 완벽하게 작동합니다! 명령은 이제 다음과 같습니다 :

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

1

무슨 일이 일어나고 있다고 생각하는 것은 쓰기 후에 검증 읽기가 수행된다는 것입니다. 동일한 레지스터가 읽기에서 현재 시간을 반환하는 경우 RTC 업데이트에 성공하더라도 디버거는 실현되지 않습니다. 이것은 디버거가 후드 아래에서 해당 레지스터에 액세스하지 않는 한 전원 레지스터의 문제를 설명 할 가능성이 적습니다. 읽은 값을 수동으로 확인하십시오. 보다 심각한 문제가있는 경우이 읽기도 실패 할 수 있습니다. 또한 목록에서 다른 레지스터를 사용해보십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.