ambiq micro의 Apollo 시리즈 CPU는 좀 독특한 면이 있다.
내가 아는 MUC들은 사용자 개발제품에 맞게 쓸 수 있도록 다양한 메모리, GPIO를 가진 제품 종류가 많은데
Apollo는 그냥 단일 제품으로 몇종류가 되지 않았다.
(물론 내가 아는 MUC는 대부분..ATMEL이나 MicroChip같은 대기업..)
그렇다고 해서 Apollo 칩을 나쁘게 보는건 아니다. 저전력과 BLE통신, 기술지원은 대기업의 제품과 비교될 정도이다.
아무튼 Apollo3 Blue로 개발를 하는 도중 100us단위로 펄스 제어를 해야 하는 경우가 생겼다.
모터 컨트롤과 같이 해야 해서 단순 딜레이 함수로는 구현하면 안 되어서 이 CPU가 어떤 타이머를 지원하는지 데이터 시트를 확인해봤다.
기본적으로 System tick 타이머가 있지만 이건 제외하고, RTC도 제외하면
Timer/Counter Module(CTIMER)와 32-bit System Timer (STIMER)가 남는다.
CTIMER는 16비트 카운터를 가지고 있고, 특정 시간 후 인터럽트나, 오디오 출력을 위한 펄스나 PWM을 만드는데 쓴다.
STIMER는 RTSO에서 Task 스케줄링 위주로 사용된다. RTOS소스를 보면 CTIMER에서 STIMER로 바꾼 흔적이 보인다.
처음에는 나도 CTIMER를 사용하려 했으나, 나는 타이머를 2개 사용해야 하는데, 타이머 넘버별 인터럽트 루틴이 없고
한 개의 인터럽트 서비스 함수에서 현 타이머 상태를 보고 해당 함수를 호출해야 해서 각 타이머 별 인터럽트 서비스 함수를 각개로 가진 STIMER로 바꾸어서 테스트했다.
테스트 조건은 다음과 같다.
- 500us 주기로 타이머 인터럽트를 실행
- 인터럽트 발생 시, LED를 토글
- 토글 결과는 스코프로 확인
STIMER의 클럭 소스를 High Frequency RC Oscillator (HFRC),3 MHz로 선택했다. 내부 발진이라 걱정했는데 데이터 시트를 보니 32.765KHz 외부 크리스탈로 자동 조절을 해서 ±2% 오차가 난다고 한다. 이 정도면 큰 문제가 없어 보인다.
인터럽트 서비스 함수에서는 다시 타이머 값을 초기화하고, LED를 토글 한다.
WAKE_INTERVAL값은 다음과 같이 설정했다.
우선 클럭 소스는 3 MHz=3,000,000Hz 이고, 내가 원하는 주기는 500us이다.
타이머는 3MHz 속도로 타이머 카운트를 증가시키는데, 1초에 필요한 타이머 개수는 3000000이다.
1us가 되기 위해 필요한 개수는 3000000에서 1000000을 나눈 만큼 하면 된다. 즉 3 클럭=3 카운트이면
1us가 된다. 500us는 당연히 3 클럭 x500us = 1500 클럭이면 된다.
이를 소스로 하면 3000000 * 5000 / 1000000인 줄 알았는데, 샘플 소스에서는 1e-6으로 표시했다.
새로운 걸 배웠다.
스코프로 찍어보니 정상적으로 출력된다.
'개발이야기' 카테고리의 다른 글
크로스컴파일러 개발환경 구축에 대한 팁 (0) | 2021.12.18 |
---|---|
무거운 프로그램에 대한 최적화 #sleep과 #select (0) | 2021.11.28 |
무선단말기로 둠 실행하기 (0) | 2021.09.18 |
펌웨어 강좌 #07 키패드 제어와 고스트 키 (0) | 2021.09.18 |
[펌웨어] 키패드 다중 키 처리에 대한 이야기 (0) | 2021.09.01 |