pico-tracker/firmware/Peripherals.md

2.7 KiB

SAM D20 Peripherals usage

Type Peripheral Function Notes
GLCK
gclk0 main clock fed from xosc/osc8m when awake, xosc32k/osculp32k when not awake.
gclk1 tcxo clock fed from xosc/osc8m. stopped when not awake.
glck2 lf clock fed from xosc32k/osculp32k. always running. divided by 32 so 1024Hz nominal.
gclk7 aprs clock fed from gclk1, div 6 / 11
TC
tc0 telemetry tick timer. 32-bit. glck1
tc1 ^^^^^
tc2 counts cycles of tcxo. 32-bit. gclk1
tc3 ^^^^^
tc4 unused (osc8m event source)
tc5 telemetry pwm 16-bit glck0, ALSO aprs carrier 16-bit gclk7
EXTINT
extint[4] gps timepulse
event channels
0 event source for timer 2 xosc measurement
1 tc4 retrigger
SERCOM
sercom0 gps
sercom1 i2c if used
sercom2 spi flash
sercom3 radio currently bitbanged as required pin layout broken in sercom

SAM D20 Interrupts usage

Name Function Priority H(0-3)L Notes
TC0_IRQn telemetry tick timer 1 latency critical for symbol timing. rate <= 1200Hz
[GPS_SERCOM]_IRQn gps usart rx 2 latency not so critical. rate <= 960Hz
EIC_IRQn timepulse 3 latency not so critical. rate = 1
TC2_IRQn xosc measurement done 3 latency not critical
ADC_IRQn adc measurement done 3 latency not critical

Clock Layout

At startup

[osc8m] --> [glck0] -> [core]

Once configured


                           |\
          [osculp32k] --> 0| |
                           | | ------+ (22-42kHz) --> [gclk2]
lftimer -> [glck_io0] --> 1| |       |
                           |/        |
                            |        |
                      *USE_LFTIMER*  |     |\
                                     +--> 0| |
                                           | | --> [gclk0] +--> [core]
                                     +--> 1| |             |--> [tc4, wakeup, measure gclk0]
                                     |     |/
                                     |      |
                           |\        |   awake?
               [osc8m]--> 0| |       |
                           | | ------+ (8MHz/16.369MHz)
      tcxo --> [xosc] --> 1| |
                           |/
                            |
                       *USE_XOSC*




                               |\
                     |\       0| |
         [osc8m]--> 0| |       | | ---> [glck1] +--> [tc0, telemetry tick]
                     | | ---> 1| |              |--> [tc2, count tcxo]
tcxo --> [xosc] --> 1| |       |/               |--> [glck7] --> [tc5, aprs carrier] --> si_gpio1
                     |/         |               |--> [adc]
                      |      awake?             |--> [extint]
                 *USE_XOSC*                     |--> [sercoms]