Teensy 3.6 / ARM-Cortex

Einstieg direkte IO-Programmierung

Die Programmierung erfolgt mit der Arduino-IDE.
Es muss die "Teensyduino"-Erweiterung installiert werden. Teensyduino Download

Nur bei der erstmaligen Programmierung muss der Reset-Taster auf dem Teensy manuell betätigt werden.
Offensichtlich wird dabei eine Erweiterung des Bootloaders geladen.

Es stehen die normalen Arduino-Funktionen zur Verfügung, diese können entsprechend der Hardware genutzt werden.
Für die Peripherieansteuerung gibt es umfangreiche Bibliotheken. Teensy Libraries

Für die direkte Ansteuerung der Hardware können die Register direkt beschrieben werden.
Die Register sind entsprechend der Prozessorbeschreibung benannt.
(K66P144M180SF5RMV2.pdf)
Bsp.: Pin Control Register Port A Bit 0 heisst: PORTA_PCR0 (siehe Kapitel 12.5)
Dieses Register kann natürlich auch direkt über die Adresse 0x4004_9000 angesprochen werden.

Der Zugriff auf die direkten IO-Pins erfolgt über das GPIO-Modul (siehe Kapitel 63).
Statt pinMode(13,OUTPUT) kann man auch schreiben:

  GPIOC_PDDR |= 32; // output
  GPIOC_PDOR |= 32; // Level 1 is driven
  GPIOC_PCOR = 32; // clear
  PORTC_PCR5 = 0x00000140; // chapter 12: PORT control and interrupt -> MUX=1(GPIO) Drive_Strength_Enable(DSE)=1 Slew_Rate_Enable=0(fast)
	  

Es gibt Register zum Setzen (High), Löschen und Umschalten der GPIO-Pins.
Damit kann man den Zustand einzelner oder mehrerer Pins ändern, unabhängig von anderen Bits im gleichen Register.

  GPIOC_PCOR = 32; // clear (set to LOW)
  GPIOC_PSOR = 32; // set   (set to HIGH)
  GPIOC_PTOR = 32; // toggle 
	  

Für jedes IO-Pin können die Betriebsart (in/out) und verschiedene Parameter eingestellt werden. (siehe Kapitel 12.5.1)
Hier kann auch ausgewählt werden, welchem Modul der einzelne Pin zugeordnet wird. (MUX "Pin Mux Control")
Es gibt pro Pin bis zu 8 verschiedene Möglichkeiten "ALT0".."ALT7" (siehe Kapitel 11.3.1)

Die (einige) IO-Module können einzeln zugeschaltet werden. Dafür ist der System Integration Module zuständig.
Das Verhalten wird im Kapitel 5.5 beschrieben:

Bsp.: Um TPM2 zuzuschalten, muss das Bit Nr. 10 im System Clock Gating Control Register 2 gesetzt werden.

  SIM_SCGC2 |= SIM_SCGC2_TPM2; // siehe Kapitel 13.2.12
  	

Wenn der Modul nicht zugeschaltet wurde, führt der Zugriff auf ein dazugehöriges Register zum Systemstop.
("transfer error termination") (INT4 oder INT5 ?)
D.h., _zuerst_ muss der Takt für das Modul eingeschaltet werden, erst danach kann der Modul konfiguriert werden.
Bsp:

  SIM_SCGC2 |= SIM_SCGC2_TPM2; // siehe Kapitel 13.2.12
  TPM2_SC = 0x08;  // count on TPM counter clock, prescaler 128
  TPM2_MOD = 0x00000003; // 31,25kHz bei prescaler 128, 0 -> 8MHz bei Prescaler 1
  TPM2_C0SC = 0x14; // output compare, toggle output on match
  	

Erst danach sollte der Ausgabe-Pin freigegeben werden.

  PORTB_PCR18 = 0x0640; // no INT, alternative 6, Drive Strength High, fast slew rate