Aurix Watchdog 기능 정리
aurix 와치독. aurix watchdog
■ 실무 핵심 기억 포인트
- T32 연결된 상태에서는 와치독이 동작하지 않는다.(enable 해도 타이머가 멈춰있음)
system.option.wdtsus on 을 적용해야 디버거 연결상태에서도 정상 동작한다.
- 와치독 타이머 값은 직접 write하는게 아니라 REL 값을 새로 쓰면, 해당 값이 timer 에도 셋팅되는 개념이다.
(Ex. REL에 100이라고 쓰면 타이머 값도 100으로 셋팅됨)
(참고. REL 쓰는 레지스터랑 Timer 레지스터는 별개의 레지스터임)
- 와치독 관련 레지스터 값 변경하려면 password access, modify access라는 절차를 거쳐야한다.
(유저매뉴얼에 쓰여 있음)
- cpu0 와치독은 디폴트로 켜져있고 나머지는 직접 켜야된다. wdtcon1 의 DR 레지스터로 컨트롤 한다
(DR : Disable Request)
■와치독 개요
알 수 없는 이유로 Sw가 stuck(어딘가 쳐박힘) 되어 정상적인 로직을 실행할 수 없을 때. 이런 상황을 감지해서 자체적으로 mcu reset을 시키기 위해 사용하는 기능이 Watchdog.
Aurix는
특정 core에 구애 받지않는 Safety Watchdog 1개
각 core별로 watchdog 1개씩 존재함
각 와치독별로 별도로 켜고 끄는게 가능함.
이 글은 일단 CPU0 와치독 기준으로 작성.
■ 기본 동작 개요
16비트 크기의 와치독 타이머가 존재함.
이 카운터는 upcount 방식으로, 클럭 속도에 맞춰 1씩 증가하다가 0xffff -> 0 으로 overflow가 발생하면 관련 flag가 set 되고. 이것이 매핑된 SMU 알람을 발생 시킨다. (와치독 타임아웃)
(아래 그림의 노란색이 16비트 타이머)
참고로 타이머가 동작하려면 와치독이 노말 모드여야하고, 노말모드가 되려면 WDTCON1 레지스터의 DR 비트를 0으로 set 해야함.
근데 CPU0 와치독의 경우 Default로 켜져 있음
한편, SMU 알람 발생시 리액션은 유저가 셋팅 가능하므로, 와치독 타임 아웃 이벤트가 발생한다고해서 사실 무조건 리셋이 일어나는건 아니다.
한편, 해당 smu 알람 리액션의 default 셋팅은 NMI이다. 그러므로 사용자가 smu 에 대해 별다른 셋팅을 하지 않은 상황에서 와치독 타임아웃 발생시. 리액션은 NMI가 된다.
그런데. 사실 와치독은 특수한 기능이기 때문에 SMU 알람만 발생시키는게 아니라, 이것이 SMU Recovery Timer 라는 것에 연결이 돼있다.
SMU Recovery Timer 역시 타이머인데,
리커버리 타이머에 연결된 고장이 발생하면 그때부터 타이머가 동작하며 타이머 값이 만료되면 이것 역시 매핑된 SMU알람을 발생시킨다.(리커버리 타이머 타임아웃)
근데, 이 알람의 Default Setting은 Reset이다.
그러므로 유저가 별다른 셋팅 안했을때 cpu 0 와치독 타임아웃 발생시 동작은.
와치톡 타임아웃 발생-> smu 알람 발생 -> NMI 발생 및 SMU 리커버리 타이머 동작시작 -> 리커버리 타임 아웃 발생 -> SMU 알람 발생 -> Mcu Reset 이다. 아래 그림 참고
■ 동작 개요2
한편, 와치독이 켜져있는 상태에서 타임아웃이 발생하지 않으려면 타이머 값이 오버플로우 되기 전에 타이머 값을 미리미리 작게 변경해야한다.
근데 이 타이머 값은 sw가 직접 write 할 수 없는 영역이다.
그러면 이 타이머 값을 어떻게 변경시키는가?
그것은 WDTCON1 레지스터의 REL 비트필드와 관련 된다.
일단 기본적으로, 와치독이 최초에 Enable 될 때 타이머의 초기값이 0이 아니라 REL 값이다.
그리고 타이머 값을 변경하려면, 타이머 레지스터를 Sw가 직접 변경하는게 아니라. 저 REL 값을 새롭게 셋팅하면, 그 값이 타이머 값에 반영된다.
ex)REL에 값 100이라고 쓰면 타이머 값도 100으로 변경
근데 REL 비트 필드가 속한 WDTCON0 레지스터는 특수한 레지스터라 단순하게 주소로 접근해서 값을 Write 하는게 아니라.
Password access 과정을 통해 lock을 푼 뒤. Modify Access라는 절차를 통해서만 업데이트가 가능하다.
암튼 이 과정을 통해서 REL 값을 업데이트 함으로써 Timer 값을 변경할 수 있고, 이것을 watchdog service라고 표현한다.
와치독 타임아웃 발생하기 전에 주기적으로 service를 해줘야 할 것이다.
아래 유저매뉴얼 참고)
■ 동작개요3
WDTCON0 뿐 아니라, WDTCON1도 수정하려면 password access 과정으로 lock을 풀어놓고 수정해야한다.
■ 동작 개요4
와치독 타이머의 클락소스는 fspb 이며
1/64 , 1/256, 1/16384 중 하나의 디바이더를 적용한다. 디폴트 셋팅은 1/16384이다.
■ 동작 개요5
cpu0 와치독이 디폴트로 켜져있기 때문에, 스타트업 과정에서 와치독타임아웃에 의한 리셋을 막으려면 빨리 와치독을 끄거나. 타이머 값을 주기적으로 컨트롤하거나. 아니면 smu 모듈을 disable시키는 것도 방법이다.