Closed sadr0b0t closed 6 years ago
Предварительный вариант в snippets: https://github.com/sadr0b0t/snippets/tree/master/arduino-timer/arduino-timer-sam
Основные моменты.
При подключении платы использовать порт, который ближе к гнезду питания - в этом случае плата определиться, как Arduino Due (Programming Port), прошьется и будет работать с Serial Monitor (печатать сообщения с Serial.print), как обычно. Если подключить через 2е гнездо, плата определится как Arduino Due (Native USB Port), тоже будет шиться, но в Serial Monitor сообщения не доедут.
Контроллеры Atmel Cortex M3 SAM, архитектура ARM, 32 бит, 84МГц
Таймеры структурированы так: -- есть 3 Timer Counter (TC) - TC0, TC1, TC2 -- внутри каждого по 3 независимых канала channel (нумерация каналов сквозная): --- TC0: TCLK0, TCLK1, TCLK2 --- TC1: TCLK3, TCLK4, TCLK5 --- TC2: TCLK6, TCLK7, TCLK8 по сути, каждый канал - это независимый (хотя, возможно, есть какие-то нюансы в виде дополнительных связей или общих настроек, лень разбираться в документации) 32-битный таймер, т.е. всего 9 таймеров.
Понятия prescaler (как в AVR и PIC32) как термина нет, но вместо него есть возможность указать для таймера один из нескольких вариантов генератора тактового сигнала CLOCK с разной частотой - по сути это и есть делитель исходного тактового сигнала: TIMER_CLOCK1: 1/2, TIMER_CLOCK2: 1/8, TIMER_CLOCK3: 1/32, TIMER_CLOCK4: 1/128 плюс TIMER_CLOCK5 для внешнего генератора сигнала.
Счетчик adjustment для тонкой настройки частоты таймера - 32-битный регистр, присутствует.
Хорошо сделать порт на Arduino DUE, которая, оказывается, 32 бит и на ARM 84 MHz.
https://store.arduino.cc/usa/arduino-due https://www.arduino.cc/en/Guide/ArduinoDue
За основу, как обычно, код Servo.cpp
Поддержку плат DUE в Arduino IDE нужно доустанавливать отдельно - в менеджере плат можно сделать поиск по Due, там будет пакет Arduino SAM Boards (32-bits ARM Cortex-M3).
Платформа устанавливается в ~/.arduino15, но библиотеки Servo там нет ~/.arduino15/packages/arduino/hardware/sam/1.6.11/libraries
Как выяснилось, начиная (как минимум) с версии 1.6.9, код для ARM (SAM) уже содежится в базовой версии Servo, которая идет вместе со средой:
В гите (в мастере в libraries библиотеки Servo почему-то уже нет, но осталась в ветке 1.5.x): https://github.com/arduino/Arduino/tree/ide-1.5.x/libraries/Servo/src
Итого, код для SAM: https://github.com/arduino/Arduino/blob/ide-1.5.x/libraries/Servo/src/sam
Для SAMD (еще какая-то архитектура, может для нее тоже нужно сделать порт) https://github.com/arduino/Arduino/blob/ide-1.5.x/libraries/Servo/src/samd
оригинальная AVR https://github.com/arduino/Arduino/tree/ide-1.5.x/libraries/Servo/src/avr
Кстати, интересный прием с исходниками для разных архитектур, раскиданным по разным папкам. Можно рассмотреть вариант использовать такой же подход, но не факт, что сработает для вообще любых архитектур, а не только тех, которые прописаны где-нибудь в настройках среды или исходниках.